编译器告诉我解开变量尽管`if let`构造

时间:2016-02-04 11:16:48

标签: ios swift macos core-data optional

我想遍历一个对象列表,这可能是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]?,因为如果可选的是nil,swift可以很容易地打开数组然后循环或不循环:

for x in someOptionalArray{
    // Do stuff
}

2 个答案:

答案 0 :(得分:1)

因为使用try?会为已经可选的值添加一层Optional。

我会使用普通的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数组,因为它不是一个数组,它是一个可选项,而且Optionals不符合序列类型。你必须先安全打开。

答案 1 :(得分:1)

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

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

或者,你也可以使用chained if let pattern打开这样的结果,

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

  }
}

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

相关问题