我正在通过用数组构建树来练习 Swift。
我有一个节点类。每个节点都有一个 ID 和一个父 ID。如果该节点是顶级节点,则父 ID 可以为零。所以我将家长 ID 设置为可选。
然后我手动(出于测试目的)创建了一个节点数组,其中包含多个树。因此存在多个父 ID = nil 的节点。
然后我创建了一个函数,通过父 ID 查找节点。
编译器没有提示。但是,当在 iPhone 模拟器中运行时(我尝试在 TableView 中显示节点),会在函数的 if 子句处显示一条消息:
fatal error: unexpectedly found nil while unwrapping an Optional value
请帮忙。谢谢。
这是代码。 (根据我自己的习惯,我在每行末尾写“;”。)
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).
最佳答案
您的查找函数声明为
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 };
}
声明 parent
属性也更有意义
如果 nil
是“预期”值,则在 Node
类中作为可选:
class Node {
var id : Int;
var parent : Int?;
init(id:Int, parent : Int?) {
self.id = id;
self.parent = parent;
}
}
或者可能是指向父节点的(可选)指针:
var parent : Node?
但这现在与您的问题无关。
关于ios - Swift:如何比较 "if"子句中的可选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32461694/