【发布时间】:2016-01-20 22:32:43
【问题描述】:
我正在编写一个测验应用程序,并且有一个表格视图来添加主题(名称保存到核心数据中),当您选择索引路径时,它将主题传递给详细视图控制器(这很好用单独),但我遇到的问题是检查是否存在任何卡片(主题实体有一个 NSOrderedSet 的“卡片”)。我的两次尝试总是崩溃,我之前用关系和 tableViews 快速完成了这个,它一直很好,所以我不确定这里有什么问题。感谢您一如既往的帮助!
我的第一次尝试,虽然它说“catch 块无法访问,因为在 do 块中没有抛出任何错误”,但它在“do”之后的行中以“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]()
使用主题方法的更新(完美运行,但放在这里仅供参考),主题是从另一个类传递的,并且在视图顶部调用的这个方法确实加载了。
func updateWithSubject(subject: Subject) {
if let subject = self.subject {
self.subject = subject
}
}
【问题讨论】:
-
在所有四次尝试中,您都会在某个时间点进行“强制”展开 (
!),这通常是应避免的。此外,您可以使用.first(可选)属性代替显式尝试访问数组中的索引0。如果您的数组为空,访问[0]将产生运行时异常。你可以试试if let firstCard = self.subject?.cards?.first ...。 (另外,Subject类/结构的.cards属性不是Card对象吗?想知道类型转换为Card。) -
它说 NSOrderedSet 没有成员“第一”,将集合转换为数组的最佳方法是什么?
-
我的错,我认为
Subject的.cards属性是Card对象的数组(你没有向我们展示Subject类/结构......但我明白了现在你用文字写了这个)。无论如何,NSOrderedSet有一个属性.array,“将有序集表示为数组。(只读)”,所以我猜你可以使用if let firstCard = self.subject?.cards?.array.first ...。 -
是的,谢谢!
标签: swift2 ios9 xcode7 relation optional-values