检查 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 ...