我想遍历一个对象列表,这可能是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
}
答案 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块。