检查Swift 2中是否存在值的问题

时间:2016-01-20 22:32:43

标签: swift2 ios9 xcode7 relation optional-values

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

2 个答案:

答案 0 :(得分:1)

在所有四次尝试中,您都会在某个时刻执行“强制”展开(!),这通常是可以避免的。此外,您尝试在0中明确访问索引NSOrderedSet;如果该集为空,则访问[0]将产生运行时异常。

相反,您可以使用.array的{​​{1}}表示形式,并使用数组的NSOrderedSet(可选)属性进行安全访问测试:

.first

答案 1 :(得分:0)

我认为你的viewDidLoad方法中存在一些尴尬。您在分配之前检查是否已初始化主题。如果那只在你的{{1}}而且只在那里,那么任务绝对不会发生。随后的强制解包肯定会失败。