【问题标题】:Problems checking to see if a value exists in Swift 2检查 Swift 2 中是否存在值时出现问题
【发布时间】:2016-01-20 22:32:43
【问题描述】:

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

【问题讨论】:

  • 在所有四次尝试中,您都会在某个时间点进行“强制”展开 (!),这通常是应避免的。此外,您可以使用.first(可选)属性代替显式尝试访问数组中的索引0。如果您的数组为空,访问[0] 将产生运行时异常。你可以试试if let firstCard = self.subject?.cards?.first ...。 (另外,Subject 类/结构的.cards 属性不是Card 对象吗?想知道类型转换为Card。)
  • 它说 NSOrderedSet 没有成员“第一”,将集合转换为数组的最佳方法是什么?
  • 我的错,我认为Subject.cards 属性是Card 对象的数组(你没有向我们展示Subject 类/结构......但我明白了现在你用文字写了这个)。无论如何,NSOrderedSet 有一个属性.array“将有序集表示为数组。(只读)”,所以我猜你可以使用if let firstCard = self.subject?.cards?.array.first ...
  • 是的,谢谢!

标签: swift2 ios9 xcode7 relation optional-values


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 也许吧,但是当我用同样的方法打印(self.subject.name)时它起作用了
    • 我们能看到更多你的viewDidLoad吗?我想知道关于传入它的类是如何调用它的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 2014-06-13
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多