0

我正在编写一个测验应用程序,并且有一个表格视图来添加主题(名称保存到核心数据中),当您选择索引路径时,它将主题传递给详细视图控制器(这本身就可以正常工作) 但我遇到的问题是检查是否存在任何卡片(主题实体有一个 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
    }
}
4

2 回答 2

1

在您的所有四次尝试中,您都会!在某个时间点进行“强制”展开 ( ),这通常是应避免的。此外,您尝试显式访问;0中的索引NSOrderedSet。如果集合为空,访问 [0] 将产生运行时异常。

相反,您可以使用数组的.array表示NSOrderedSet.first(可选)属性进行安全访问测试:

if let firstCard = self.subject?.cards?.array.first ...
于 2016-01-20T23:07:48.730 回答
0

我认为你的updateWithSubject方法有些尴尬。您正在检查在分配给它之前是否已经初始化了一个主题。如果那是你的viewDidLoad并且只有那里,那么分配将永远不会发生。接下来的强制解包肯定会失败。

于 2016-01-20T22:45:26.403 回答