Swift:如何比较“if”子句中的Optional

时间:2015-09-08 15:28:56

标签: ios swift if-statement compare optional

我正在通过使用数组构建树来练习Swift。

我有一个Node节点。每个节点都有一个ID和一个父ID。如果节点是顶级节点,则父ID可以是nil。所以我将父ID设为可选。

然后我手动(用于测试目的)创建了一个包含多个树的节点数组。因此,有多个节点的父ID = nil。

然后我创建了一个按父ID查找节点的函数。

编译器没有抱怨。但是,当在iPhone模拟器中运行时(我试图在tableview中显示节点),一条消息在函数的if子句中显示

  

致命错误:在解包可选值时意外发现nil

请帮忙。感谢。

这是代码。 (为了我自己的习惯,我在每一行的末尾写上“;”。)

var text = ''
+ 'PAY VALUES TO SUM - WITHOU NOTHING: 0.00 (IGNORE THE REST)\n'
+ 'PAY VALUES TO SUM - ADD. 50 YEARS: 0.00 (IGNORE THE REST)\n'
+ 'PAY VALUES TO SUM - ADD. 70 YEARS: 0.00 (IGNORE THE REST)\n'
+ 'PAY VALUES TO SUM - ADD. 80 YEARS: 0.00 (IGNORE THE REST)';

var re = /^PAY VALUES TO SUM - (?:WITHOU NOTHING|ADD\. \d+ YEARS): ([\d.]+).*$/gm;
document.write('<pre>' + text.replace(re, '$1').replace(/\n/g, ' ') + '</pre>');

// a little less specific

var re = /^PAY VALUES TO SUM - [^:]+: ([\d.]+).*$/gm;
document.write('<pre>' + text.replace(re, '$1').replace(/\n/g, ' ') + '</pre>');

1 个答案:

答案 0 :(得分:4)

您的查找功能被声明为

func findNodes(parent:Int!) -> [Node]

其中参数声明为隐式解包可选, 所以它将在每次访问时解开。如果你想通过nil 作为参数,那么&#34;正常&#34;选择更有意义:

func findNodes(parent:Int?) -> [Node] {
    var arr:[Node] = [];
    for node in allNodes {
        if node.parent == parent {
            arr.append(node);
        }
    }
    return arr;
}

请注意,您可以将代码简化为(Swift 1.2):

func findNodes(parent:Int?) -> [Node] {
    return filter(allNodes) { $0.parent == parent };
}

声明parent属性也更有意义 在Node类中,如果nil是&#34;预期&#34;值:

class Node {
    var id : Int;
    var parent : Int?;
    init(id:Int, parent : Int?) {
        self.id = id;
        self.parent = parent;
    }
}

或者可能是(可选)指针到父节点:

var parent : Node?

但现在与您的问题无关。