Ios Swift:如何比较“中的可选项”;如果;条款
我正在练习用数组建树 我有一个类节点。每个节点都有一个ID和一个父ID。如果节点是顶级节点,则父ID可以为零。因此,我将家长ID设置为可选 然后我手动(出于测试目的)创建了一个包含多个树的节点数组。因此,存在多个父ID为nil的节点 然后我创建了一个函数,该函数根据节点的父ID查找节点 我没有抱怨。但是,当在iPhone模拟器中运行时(我尝试在tableview中显示节点),函数中的if子句会显示一条消息: 致命错误:在展开可选值时意外发现nil 请帮忙。谢谢 这是代码。 (出于我自己的习惯,我在每行末尾写“;”Ios Swift:如何比较“中的可选项”;如果;条款,ios,swift,if-statement,compare,optional,Ios,Swift,If Statement,Compare,Optional,我正在练习用数组建树 我有一个类节点。每个节点都有一个ID和一个父ID。如果节点是顶级节点,则父ID可以为零。因此,我将家长ID设置为可选 然后我手动(出于测试目的)创建了一个包含多个树的节点数组。因此,存在多个父ID为nil的节点 然后我创建了一个函数,该函数根据节点的父ID查找节点 我没有抱怨。但是,当在iPhone模拟器中运行时(我尝试在tableview中显示节点),函数中的if子句会显示一条消息: 致命错误:在展开可选值时意外发现nil 请帮忙。谢谢 这是代码。 (出于我自己的习惯,我
您的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):
声明parent
属性也更有意义
在节点
类中,如果nil
是“预期”值,则将其作为可选值:
或者是指向父节点的(可选)指针:
var parent : Node?
但现在这与你的问题无关。谢谢你,马丁·R,这对我很有用!我是斯威夫特的新手。我最初将其设置为隐式展开的可选项,因为我认为这样每次访问它时都会更容易。让我问另一个愚蠢的问题:这是否意味着可选可以为零,而隐式展开可选不应该为零?是的,我想使用您最后的建议“var parent:Node?”,但后来发现如果有一天我需要,我不知道如何将其存储在数据库中,所以我放弃了,而是使用了Int-ID…@golddc:看看隐式展开选项的可能用例。@golddc:而不是
node.parent
您将存储nod.parent?.ID
,只是我的2ct。
func findNodes(parent:Int?) -> [Node] {
return filter(allNodes) { $0.parent == parent };
}
class Node {
var id : Int;
var parent : Int?;
init(id:Int, parent : Int?) {
self.id = id;
self.parent = parent;
}
}
var parent : Node?