我正在编写测验应用程序并且有一个表格视图来添加主题(名称保存到核心数据),当您选择索引路径时,它将主题传递给详细视图控制器(这适用于我自己很好)但我遇到的问题是检查是否存在任何卡片(主题实体有一个NSOrderedSet" Cards")。在我的两次尝试中,我一直在崩溃,我之前已经通过关系和tableViews迅速完成了这项工作,而且它总是很好,所以我不确定这里的问题是什么。谢谢你一直以来的帮助!
我的第一次尝试,虽然它说" catch块是无法访问的,因为在阻止"中没有抛出任何错误,它与" Bad Instruction"崩溃在"做"
之后 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]()
使用subject方法更新(完美地工作,但只是为了参考),主题从另一个类传递,并且在视图顶部调用的此方法确实加载。
func updateWithSubject(subject: Subject) {
if let subject = self.subject {
self.subject = subject
}
}
答案 0 :(得分:1)
在所有四次尝试中,您都会在某个时刻执行“强制”展开(!
),这通常是可以避免的。此外,您尝试在0
中明确访问索引NSOrderedSet
;如果该集为空,则访问[0]将产生运行时异常。
相反,您可以使用.array
的{{1}}表示形式,并使用数组的NSOrderedSet
(可选)属性进行安全访问测试:
.first
答案 1 :(得分:0)
我认为你的viewDidLoad
方法中存在一些尴尬。您在分配之前检查是否已初始化主题。如果那只在你的{{1}}而且只在那里,那么任务绝对不会发生。随后的强制解包肯定会失败。