检查 Swift 中是否存在值时出现问题 2
Problems checking to see if a value exists in Swift 2
我正在写一个测验应用程序,有一个 table 视图可以添加主题(名称保存到核心数据),当您 select 索引路径时,它会传递主题到详细视图控制器(这本身就可以正常工作)但我遇到的问题是检查是否存在任何卡片(主题实体的 NSOrderedSet 为 "Cards")。我在两次尝试中一直遇到崩溃,我之前在 swift 中使用关系和 table 视图进行过此操作,并且一直很好,所以我不确定这里的问题是什么。感谢您一如既往的帮助!
我的第一次尝试,虽然它说 "catch block is unreachable because no errors are thrown in do block",但它在 "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]()
使用主题方法更新(效果很好,但把它放在这里仅供参考),主题是从另一个 class 传递的,这个在视图顶部调用的方法确实加载了。
func updateWithSubject(subject: Subject) {
if let subject = self.subject {
self.subject = subject
}
}
我认为您的 updateWithSubject
方法有些不对劲。您正在检查是否有一个主题在分配给它之前已经初始化。如果它在您的 viewDidLoad
中并且仅在那里,则分配将永远不会发生。接下来的强制解包肯定会失败。
在您的所有四次尝试中,您在某个时刻进行了 "forced" 展开 (!
),这通常是要避免的。此外,您尝试在 NSOrderedSet
中显式访问索引 0
;如果集合为空,访问 [0] 将产生运行时异常。
相反,您可以使用 NSOrderedSet
的 .array
表示并使用数组的 .first
(可选)属性 进行安全访问测试:
if let firstCard = self.subject?.cards?.array.first ...
我正在写一个测验应用程序,有一个 table 视图可以添加主题(名称保存到核心数据),当您 select 索引路径时,它会传递主题到详细视图控制器(这本身就可以正常工作)但我遇到的问题是检查是否存在任何卡片(主题实体的 NSOrderedSet 为 "Cards")。我在两次尝试中一直遇到崩溃,我之前在 swift 中使用关系和 table 视图进行过此操作,并且一直很好,所以我不确定这里的问题是什么。感谢您一如既往的帮助!
我的第一次尝试,虽然它说 "catch block is unreachable because no errors are thrown in do block",但它在 "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]()
使用主题方法更新(效果很好,但把它放在这里仅供参考),主题是从另一个 class 传递的,这个在视图顶部调用的方法确实加载了。
func updateWithSubject(subject: Subject) {
if let subject = self.subject {
self.subject = subject
}
}
我认为您的 updateWithSubject
方法有些不对劲。您正在检查是否有一个主题在分配给它之前已经初始化。如果它在您的 viewDidLoad
中并且仅在那里,则分配将永远不会发生。接下来的强制解包肯定会失败。
在您的所有四次尝试中,您在某个时刻进行了 "forced" 展开 (!
),这通常是要避免的。此外,您尝试在 NSOrderedSet
中显式访问索引 0
;如果集合为空,访问 [0] 将产生运行时异常。
相反,您可以使用 NSOrderedSet
的 .array
表示并使用数组的 .first
(可选)属性 进行安全访问测试:
if let firstCard = self.subject?.cards?.array.first ...