小编Nev*_*ani的帖子

使用带有密钥的可编码,有时是Int,有时是String

我有一个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)

json swift swift4 codable

26
推荐指数
4
解决办法
9040
查看次数

Mac Catalyst 问题 - 在为 iOS 模拟器构建的目标文件中链接

我正在尝试使用新的 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 需要解决的问题还是我可以在我的项目中解决的问题?

ios swift mac-catalyst

11
推荐指数
1
解决办法
5776
查看次数

滚动时如何防止tableview节头粘住?

我有一个包含许多部分的表格视图。我正在使用一个实际的 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)

uitableview ios swift

9
推荐指数
2
解决办法
8050
查看次数

UIButton,左侧显示文本,右侧显示图像

我想在按钮的右侧放置一个图像,在左侧放置文本。但是我希望文本距离按钮的左边距20点,图像距离右边距20点。我该怎么做?我想在UIButton中使用本机图像和标签,我不想在按钮上方放置任何内容。这是一个例子: 在此处输入图片说明

ios swift swift3

5
推荐指数
2
解决办法
7807
查看次数

使用navigationBar刷新控制器,该控制器优先将RangeTitles设置为true

我正在使用导航控制器,在导航控制器中,我有一个带有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点,所以几乎与屏幕大小相同.

发生的事情是,动画师开始制作动画但是当它获得某种特定(它应该刷新的点)时,它就会停止.我已经包含了停止点的屏幕截图.然后,当我继续向下滚动时,它会进行刷新.但它应该早一点完成.我必须向下滚动到导航栏延伸到几乎整个屏幕长度的点.

这就是它停止的地方,但是一旦我们把它拉下来,就应该刷新

ios swift swift4 ios11

5
推荐指数
1
解决办法
524
查看次数

使用Alamofire和Codable进行请求

我有一个简单的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)

json swift swift4 codable

5
推荐指数
1
解决办法
6322
查看次数

使用 Codable 用一个结构解码两个不同的 JSON 响应

我从两个不同的端点获取数据。一个端点返回这样的订单:

{
  "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)

json struct swift swift4 codable

5
推荐指数
1
解决办法
1812
查看次数

没有参数的可选完成处理程序

我基本上希望有一个可选的完成处理程序,该处理程序没有传递回的参数。这是我到目前为止所拥有的,但显然是错误的。

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,因为我希望它充当刷新数据的通用函数。我希望完成处理程序为可选的原因是,有时刷新完成后,我不需要执行任何操作。

我对@转义的含义也很困惑。当我做这样的事情时,我通常会拥有它,但是任何清晰度都会很棒。我已经在网上做了一些功课,但没有得到很多真正的收获。

swift swift4

5
推荐指数
1
解决办法
2357
查看次数

将具有一种类型的结构更改为另一种类型

我有两个具有相同字段的结构。合并它们的最佳方法是什么。

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)

什么是转换的最佳方式type2type1?我从 API 获得返回并使用 codable 解析它,但有两个不同的结构,我需要获取一个结构。数据是相同的,只是在类型方面映射不同。一些结构有更多的信息,而另一些则有更少的信息。

swift swift4

3
推荐指数
2
解决办法
1405
查看次数

子视图的 isHidden 和 remove 有什么区别?

使用从子视图中删除与隐藏之间有什么区别?我需要一个用户无法访问的按钮。哪个更好、更安全以确保用户无法访问该按钮?这两种方法有什么区别,除了这里提到的这两种方法之外,还有没有更好的方法可以做到这一点?

ios

2
推荐指数
1
解决办法
969
查看次数

标签 统计

swift ×9

swift4 ×6

ios ×5

codable ×3

json ×3

ios11 ×1

mac-catalyst ×1

struct ×1

swift3 ×1

uitableview ×1