我有一个API,有时会id在JSON中作为Int 返回一个特定的键(在本例中),有时它将返回与String相同的键.如何使用codable来解析JSON?
struct GeneralProduct: Codable {
var price:Double!
var id:String?
var name:String!
private enum CodingKeys: String, CodingKey {
case price = "p"
case id = "i"
case name = "n"
}
init(price:Double? = nil, id: String? = nil, name: String? = nil) {
self.price = price
self.id = id
self.name = name
}
}
Run Code Online (Sandbox Code Playgroud)
我不断收到此错误消息:Expected to decode String but found a number instead.返回数字的原因是因为id字段为空,并且当id字段为空时,它默认返回0作为可编码标识为数字的ID.我基本上可以忽略ID键但是可编码不会让我根据我的知识忽略它.处理这个问题的最佳方法是什么?
这是JSON.它非常简单
工作
{
"p":2.12,
"i":"3k3mkfnk3",
"n":"Blue Shirt"
}
Run Code Online (Sandbox Code Playgroud)
错误 - 因为系统中没有id,它返回0作为默认值,可编码显然看作是与字符串相对的数字.
{
"p":2.19, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用新的 Mac Catalyst 在我的 Mac 上构建我的 iOS/iPadOS 项目。当我在 iPhone 模拟器上构建它时一切正常,但是当我在 Mac 上构建它时,出现此错误。
in /Users/nevin/Documents/[projectName]/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics(CLSInternalReport.o), building for Mac Catalyst, but linking in object file built for iOS Simulator, file '/Users/nevin/Documents/[projectName]/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics' for architecture x86_64
Run Code Online (Sandbox Code Playgroud)
多个 Pod 会发生这种情况,因此,例如,如果我删除 Crashlytics,另一个 Pod 会出现类似的错误。有人知道这是 Crashlytics 需要解决的问题还是我可以在我的项目中解决的问题?
我有一个包含许多部分的表格视图。我正在使用一个实际的 tableview 单元格,我将其出列用作自定义节标题。我遇到的问题是当我将部分标题“粘”到表格顶部时,直到出现下一部分。
我怎样才能防止这种情况发生并让它像往常一样向上滚动?
这是我的代码
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 3 {
let cell = tableView.dequeueReusableCell(withIdentifier: "headerCell") as! HeaderTableViewCell
return cell
}
return UIView()
}
Run Code Online (Sandbox Code Playgroud) 我正在使用导航控制器,在导航控制器中,我有一个带有tableview的VC,它拥抱superView的顶部,底部,左侧和右侧.当我self.navigationController?.navigationBar.prefersLargeTitles准备好了false,一切正常.但是当我把它设置为时true,我必须拖得非常远,以使我的刷新控制器触发刷新.我必须拖得太远,以至于我必须用两根手指在屏幕上向下拖动.我在这里做错了什么,或者这是Apple的问题?这是我添加刷新控制器的方式.我没有包含handleRefresh函数,因为代码甚至没有达到这一点.
var refreshControl = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
refreshControl.addTarget(self, action:
#selector(FeedViewController.handleRefresh(_:)), for: UIControlEvents.valueChanged)
refreshControl.tintColor = UIColor.gray
self.tableView.refreshControl = refreshControl
}
Run Code Online (Sandbox Code Playgroud)
我正在使用swift 4和iOS 11与Xcode 9.我的tableview中的单元格很大 - 一个单元格大约400-500点,所以几乎与屏幕大小相同.
发生的事情是,动画师开始制作动画但是当它获得某种特定(它应该刷新的点)时,它就会停止.我已经包含了停止点的屏幕截图.然后,当我继续向下滚动时,它会进行刷新.但它应该早一点完成.我必须向下滚动到导航栏延伸到几乎整个屏幕长度的点.
我有一个简单的put请求,我使用Alamofire的Parameters类型将数据发送到服务器.我想用可编码的.如何将我的可编码结构转换为参数或重新配置Alamofire请求以将JSON对象作为参数?使用Alamofire发送和发送请求的最佳和最有效的方法是什么?
以下是我现在正在与Alamofire一起做的事情.
func addProduct(product:MainProduct, completionHandler:@escaping ((JSON?, Error?)->Void)) {
let url = "INSERT_URL"
let headers: HTTPHeaders = [
"Content-Type": "application/json"
]
var parameters:Parameters = [:]
parameters["orderId"] = product.orderId
parameters["orderSize"] = product.orderSize
parameters["theOrderStatus"] = product.orderStatus
let purchDate = Int((product.purchaseDate.timeIntervalSince1970)*1000)
parameters["purchaseDate"] = purchDate
parameters["archived"] = false
Alamofire.request(url, method:.put, parameters: parameters, encoding: JSONEncoding.default, headers:headers).responseJSON {response in
switch response.result {
case .success(let value):
print ("finish")
let swiftyJson = JSON(value)
completionHandler(swiftyJson, nil)
case .failure(let error):
completionHandler(nil, error)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我们的结构.
struct MainProduct:Codable{
var …Run Code Online (Sandbox Code Playgroud) 我从两个不同的端点获取数据。一个端点返回这样的订单:
{
"price":"123.49",
"quantity":"4",
"id":"fkuw-4834-njk3-4444",
"highPrice":"200",
"lowPrice":"100"
}
Run Code Online (Sandbox Code Playgroud)
另一个端点返回这样的顺序:
{
"p":"123.49", //price
"q":"4", //quantity
"i":"fkuw-4834-njk3-4444" //id
}
Run Code Online (Sandbox Code Playgroud)
我想使用相同的 Codable 结构来解码两个 JSON 响应。我该怎么做?是否可以使用一个结构来做到这一点,或者我必须创建第二个结构?这是第一个 JSON 返回的结构现在的样子:
struct SimpleOrder:Codable{
var orderPrice:String
var orderQuantity:String
var id:String
var highPrice:String
private enum CodingKeys: String, CodingKey {
case orderPrice = "price"
case orderQuantity = "quantity"
case id
case highPrice
}
}
Run Code Online (Sandbox Code Playgroud) 我基本上希望有一个可选的完成处理程序,该处理程序没有传递回的参数。这是我到目前为止所拥有的,但显然是错误的。
func refreshAccountData(type:String, completion: (()->(Void))?){
//Network call is made
Alamofire.request... {
completion?()
//Here is where I want to call the optional completion handler
}
}
Run Code Online (Sandbox Code Playgroud)
我不想在完成块中传递任何参数。我只想知道网络通话何时完成,以便刷新UI。我不想在这里刷新UI,因为我希望它充当刷新数据的通用函数。我希望完成处理程序为可选的原因是,有时刷新完成后,我不需要执行任何操作。
我对@转义的含义也很困惑。当我做这样的事情时,我通常会拥有它,但是任何清晰度都会很棒。我已经在网上做了一些功课,但没有得到很多真正的收获。
我有两个具有相同字段的结构。合并它们的最佳方法是什么。
struct Type1{
var variable1:String?
var variable2:Double?
var variable3:String?
var notImporant:String?
}
struct Type2{
var variable1A:String?
var variable2A:String?
var variable3A:String!
}
Run Code Online (Sandbox Code Playgroud)
什么是转换的最佳方式type2来type1?我从 API 获得返回并使用 codable 解析它,但有两个不同的结构,我需要获取一个结构。数据是相同的,只是在类型方面映射不同。一些结构有更多的信息,而另一些则有更少的信息。
使用从子视图中删除与隐藏之间有什么区别?我需要一个用户无法访问的按钮。哪个更好、更安全以确保用户无法访问该按钮?这两种方法有什么区别,除了这里提到的这两种方法之外,还有没有更好的方法可以做到这一点?
swift ×9
swift4 ×6
ios ×5
codable ×3
json ×3
ios11 ×1
mac-catalyst ×1
struct ×1
swift3 ×1
uitableview ×1