【问题标题】:Initializer for conditional binding must have Optional type, not '[String : AnyObject]'条件绑定的初始化程序必须具有 Optional 类型,而不是 '[String : AnyObject]'
【发布时间】:2021-04-26 00:06:22
【问题描述】:

我一直遇到这个错误。我已经尝试了很多东西,有人能告诉我我哪里出错了吗?这是我的代码:

    let receiptFileURL = Bundle.main.appStoreReceiptURL
    let receiptData = try? Data(contentsOf: receiptFileURL!)
    let recieptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    guard let jsonDict: [String: AnyObject] = ["receipt-data" : recieptString! as AnyObject, "password" : IAPProduct.apiID.rawValue as AnyObject] else {
        DispatchQueue.main.async {
            self.performSegue(withIdentifier: "mainVC", sender: nil)
        }
    }

【问题讨论】:

  • ["receipt-data" : recieptString! as AnyObject, "password" : IAPProduct.apiID.rawValue as AnyObject] 不能为 nil,所以它不是可选的,所以 guard let 不能做。为什么使用guard letif let?打开一个可选的,不是吗?这里没有可选的。

标签: swift xcode


【解决方案1】:

你要创建一个非可选的字典所以错误

条件绑定的初始化器必须是 Optional 类型,而不是 '[String : AnyObject]'

提醒您,您不能可选地绑定非可选类型。删除guard 表达式。

顺便说一句,JSON 集合类型从不包含 AnyObject 值,这避免了沿途的丑陋桥接,您可以省略 base64EncodedString 中的 options 参数

let receiptFileURL = Bundle.main.appStoreReceiptURL!
let receiptData = try! Data(contentsOf: receiptFileURL)
let receiptString = receiptData.base64EncodedString()
let jsonDict : [String: Any] = ["receipt-data" : receiptString, "password" : IAPProduct.apiID.rawValue]
// DispatchQueue.main.async {
//    self.performSegue(withIdentifier: "mainVC", sender: nil)
// }

【讨论】:

    【解决方案2】:

    由于您正在初始化数据,["receipt-data" : recieptString! as AnyObject, "password" : IAPProduct.apiID.rawValue as AnyObject] 不能为 nil,因此将其包装在 guard 中是没有意义的。您在此语句中的唯一可选选项是 recieptString,您正在强制解包(如果 recieptString! 为 nil,则可能导致崩溃。

    所以将你的保护声明改为

    guard let recieptString = receiptData?.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) else {
        // ...
        return
    }
    

    然后在没有保护或强制解包的情况下初始化字典:

    let jsonDict: [String: AnyObject] = ["receipt-data" : recieptString as AnyObject, "password" : IAPProduct.apiID.rawValue as AnyObject]
    

    【讨论】:

      猜你喜欢
      • 2016-01-27
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多