gpt4 book ai didi

ios - Swift:如何比较 "if"子句中的可选

转载 作者:可可西里 更新时间:2023-11-01 00:52:28 26 4
gpt4 key购买 nike

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

我有一个节点类。每个节点都有一个 ID 和一个父 ID。如果节点是顶级节点,则父 ID 可以为 nil。所以我将 parent 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com