我正在通过使用数组构建树来练习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>');
答案 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?
但现在与您的问题无关。