Ios 编译器告诉我不管'if let'构造如何展开变量

Ios 编译器告诉我不管'if let'构造如何展开变量,ios,swift,macos,core-data,optional,Ios,Swift,Macos,Core Data,Optional,我想循环浏览对象列表,它可能是nil 所以我想这样做: if let versions = try? moc?.executeFetchRequest(req) as? [Version]{ for v in versions{ // Do stuff } } 我确实假设我将拥有一个Version对象数组。但是,编译器不会接受这一点,并告诉我必须强制展开版本变量才能循环通过它们。因此,我以for循环结束,如下所示: for v in versions!{

我想循环浏览对象列表,它可能是
nil

所以我想这样做:

if let versions = try? moc?.executeFetchRequest(req) as? [Version]{
    for v in versions{
        // Do stuff
    }
}
我确实假设我将拥有一个
Version
对象数组。但是,编译器不会接受这一点,并告诉我必须强制展开
版本
变量才能循环通过它们。因此,我以for循环结束,如下所示:

for v in versions!{
    // Do stuff
}
Xcode 7.2中的comiler错误

可选类型的值
[Version]?
未展开;你的意思是使用

旁注

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

for x in someOptionalArray{
    // Do stuff
}

因为使用
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)
}

另外,不,您不能在可选数组上循环,因为它不是数组,它是可选的,并且Optionals不符合序列类型。您必须首先安全地展开。

因为使用
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)
}

另外,不,您不能在可选数组上循环,因为它不是数组,它是可选的,并且Optionals不符合序列类型。您必须先安全地打开包装。

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

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

  }
}
或者,您也可以使用chained if let模式来展开结果,如下所示

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

  }
}

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

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

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

  }
}
或者,您也可以使用chained if let模式来展开结果,如下所示

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

  }
}
或者也可以使用try/catch块