问题检查,看看是否存在一个值Swift 2

问题描述:

我正在写一个测验应用程序,并有一个表视图添加一个主题(名称保存到核心数据),当您选择一个索引路径它通过受到详细视图控制器的限制(这个工作本身就很好),但是我遇到的麻烦是检查是否存在任何卡(主体实体具有“卡”的NSOrderedSet)。在我的两次尝试中,我一直在崩溃,我之前用关系和tableViews在swift中完成了它,并且一直很好,所以我不确定这里存在什么问题。感谢您一如既往的帮助!问题检查,看看是否存在一个值Swift 2

我第一次尝试,虽然它说:“catch块不可访问,因为任何错误都是扔在做块”,它与上线“坏指令”崩溃后“做”

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 
    } 
} 
+0

在你尝试所有四个,你做一个“逼”在某些时候解开('!'),这通常是可以避免的。另外,你也可以使用'.first'(可选)属性来代替显式地尝试访问数组中的索引'0'。如果你的数组是空的,访问'[0]'会产生一个运行时异常。你可以试试'如果让firstCard = self.subject?.cards?.first ...'。 (另外,'Subject'类/结构体的'.cards'属性不是'Card'对象?想知道类型转换为'Card'。) – dfri

+0

它说NSOrderedSet没有“first”成员,会是什么将集合转换为数组的最佳方法是什么? – Echizzle

+1

我的不好,我认为'Subject'的'.cards'属性是'Card'对象的数组(你没有向我们展示'Subject'类/结构体......但我现在看到你写了这个文本)。无论如何,'NSOrderedSet'有一个属性'.array',_“将有序集合表示为一个数组。(只读)”_,所以我想你可以使用'if firstCard = self.subject?.cards ?.array.first ...'。 – dfri

在所有的四次尝试中,您都会在某个时间点进行“强制”解包(!),这通常要避免。此外,您试图明确访问您的NSOrderedSet中的索引0;如果该集合为空,则访问[0]将产生运行时异常。

相反,你可以使用NSOrderedSet.array表示和使用阵列的.first(可选)财产安全接入测试:

if let firstCard = self.subject?.cards?.array.first ... 

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

+0

也许,但是当我用相同的方法打印(self.subject.name)时它工作 – Echizzle

+0

我们可以看到更多的'viewDidLoad'吗?我想知道它是如何被传入的。 – mango