[英]Swift: How to compare Optional in “if” clause
我正在通过使用数组构建树来练习Swift。
我有一个班级节点。 每个节点都有一个ID和一个父ID。 如果该节点是顶级节点,则父ID可以为nil。 因此,我将家长ID设为可选。
然后,我手动(出于测试目的)创建了一个节点数组,其中包含多个树。 因此,有多个父ID = nil的节点。
然后,我创建了一个函数,该函数通过其父ID查找节点。
编译器没有抱怨。 但是,当在iPhone模拟器中运行(我试图在表视图中显示节点)时, 在函数的if子句中会显示一条消息:
致命错误:解开Optional值时意外发现nil
请帮忙。 谢谢。
这是代码。 (出于我自己的习惯,我在每行末尾都写上“;”。)
class Node {
var id:Int;
var parent:Int!;
init(id:Int, parent:Int!) {
self.id = id;
self.parent = parent;
}
}
var allNodes = [
Node(id:1, parent: nil),
Node(id:2, parent: nil),
Node(id:3, parent: 1),
Node(id:4, parent: 1),
Node(id:5, parent: 2),
Node(id:6, parent: 2),
Node(id:7, parent: 2)
];
func findNodes(parent:Int!) -> [Node] {
var arr:[Node] = [];
for node in allNodes {
if node.parent == parent! {
// if I use "if node.parent == parent" without the "!" it gives me the same error
arr.append(node);
}
}
return arr;
}
let nodes = self.findNodes(nil);
// called in tableview functions.
// same message if I use findNodes(1).
您的find函数声明为
func findNodes(parent:Int!) -> [Node]
该参数被声明为隐式解包的可选参数,因此它将在每次访问时进行解包。 如果要传递nil
作为参数,则“常规”可选更有意义:
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 };
}
如果nil
是“ expected”值,则在Node
类中将parent
属性声明为可选也是更有意义的:
class Node {
var id : Int;
var parent : Int?;
init(id:Int, parent : Int?) {
self.id = id;
self.parent = parent;
}
}
或指向父节点的(可选) 指针 :
var parent : Node?
但这与您的问题无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.