问题检查,看看是否存在一个值Swift 2
问题描述:
我正在写一个测验应用程序,并有一个表视图添加一个主题(名称保存到核心数据),当您选择一个索引路径它通过受到详细视图控制器的限制(这个工作本身就很好),但是我遇到的麻烦是检查是否存在任何卡(主体实体具有“卡”的NSOrderedSet)。在我的两次尝试中,我一直在崩溃,我之前用关系和tableViews在swift中完成了它,并且一直很好,所以我不确定这里存在什么问题。感谢您一如既往的帮助!问题检查,看看是否存在一个值Swift 2
我第一次尝试,虽然它说:“catch块不可访问,因为任何错误都是扔在做块”,它与上线“坏指令”崩溃后“做”
do {
if let firstCard = self.subject?.cards![0] as? Card {
self.currentCard = firstCard
}
} catch {
}
我的第二次尝试,它崩溃的第一行
if let firstCard = self.subject?.cards![0] as? Card {
self.currentCard = firstCard
}
我的第三次尝试
if self.subject!.cards != nil {
self.currentCard = self.subject!.cards![0] as! Card
}
我的第四次尝试,展开双方的学科属性和学科,它不会响起self.subject.cards但仍然崩溃
if let firstCard = self.subject!.cards?[0] as? Card {
self.currentCard = firstCard
}
,其中属性声明
var draggableView = DraggableView!()
var subject : Subject?
var currentCard : Card?
var cardArray = [Card]()
与标的方法的更新(完美的作品,但把它放在这里仅供参考),主题是从另一个类传递的,并且在视图顶部调用的这个方法确实加载了。
func updateWithSubject(subject: Subject) {
if let subject = self.subject {
self.subject = subject
}
}
答
在所有的四次尝试中,您都会在某个时间点进行“强制”解包(!
),这通常要避免。此外,您试图明确访问您的NSOrderedSet
中的索引0
;如果该集合为空,则访问[0]将产生运行时异常。
相反,你可以使用NSOrderedSet
的.array
表示和使用阵列的.first
(可选)财产安全接入测试:
if let firstCard = self.subject?.cards?.array.first ...
在你尝试所有四个,你做一个“逼”在某些时候解开('!'),这通常是可以避免的。另外,你也可以使用'.first'(可选)属性来代替显式地尝试访问数组中的索引'0'。如果你的数组是空的,访问'[0]'会产生一个运行时异常。你可以试试'如果让firstCard = self.subject?.cards?.first ...'。 (另外,'Subject'类/结构体的'.cards'属性不是'Card'对象?想知道类型转换为'Card'。) – dfri
它说NSOrderedSet没有“first”成员,会是什么将集合转换为数组的最佳方法是什么? – Echizzle
我的不好,我认为'Subject'的'.cards'属性是'Card'对象的数组(你没有向我们展示'Subject'类/结构体......但我现在看到你写了这个文本)。无论如何,'NSOrderedSet'有一个属性'.array',_“将有序集合表示为一个数组。(只读)”_,所以我想你可以使用'if firstCard = self.subject?.cards ?.array.first ...'。 – dfri