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块