【问题标题】:Compiler tells me to unwrap variable despite `if let` construct尽管有`if let`构造,编译器告诉我解包变量
【发布时间】:2016-02-04 11:16:47
【问题描述】:

我想遍历一个对象列表,可能是nil。

所以我想这样做:

if let versions = try? moc?.executeFetchRequest(req) as? [Version]{
    for v in versions{
        // Do stuff
    }
}

我确实假设我将拥有一个 Version 对象数组。但是,编译器不会接受这一点,并告诉我必须强制解开 versions 变量才能循环遍历它们。所以我最终得到了这样的 for 循环:

for v in versions!{
    // Do stuff
}

Xcode 7.2 中的编译器错误

可选类型[Version]? 的值未解包;你的意思是使用! 还是??

旁注:

我还想知道为什么 swift 不让我循环遍历 [Anyobject]?,因为 swift 可以轻松地解开数组然后循环遍历或者如果可选为 nil 则根本不循环:

for x in someOptionalArray{
    // Do stuff
}

【问题讨论】:

    标签: ios swift macos core-data optional


    【解决方案1】:

    这里的问题是尝试?您正在使用的版本。它返回可选的 [Version] 数组。所以,要么使用强制尝试,要么使用 try!像这样,

    if let versions = try! moc?.executeFetchRequest(req) as? [Version]{
        for v in versions{
            // Do stuff
        }
    }
    

    或者,你也可以使用链式 if let 模式来解包这样的结果,

    if let optionalResult = try? moc?.executeFetchRequest(fetchRequest) as? [Version], let result = optionalResult {
      for result in result {
    
      }
    }
    

    或者你也可以使用 try/catch 块。

    【讨论】:

      【解决方案2】:

      因为使用try? 给已经是可选的值增加了一层可选。

      我会改用普通的try,例如:

      do {
          if let mocOK = moc, versions = try mocOK.executeFetchRequest(req) as? [Version] {
              for v in versions {
                  // Do stuff
              }
          }
      } catch let error as NSError {
          print(error)
      }
      

      另外,不,您不能循环遍历 Optional 数组,因为它不是 Array,它是 Optional,而且 Optional 不符合序列类型。你必须先安全地打开包装。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多