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

标签 ios swift if-statement compare option-type

我正在通过用数组构建树来练习 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/

相关文章:

ios - swift 无法转换类型的值

json - 如何用未知 key 解码json

ios - 在 Swift dequeueReusableCellWithIdentifier 中,需要时间来加载

java - 如何阻止 if 语句中的数字变小

python - 计算标记化词中的词频 - 使用 else if 逻辑

ios - 如何从模式返回到主视图 Controller

ios - 一个 ViewController 中的多个 NavigationController

ios - 在水平 StackView 内部,当拉伸(stretch)到较小的屏幕时,标签会被切掉边缘。如何解决这个问题?

javascript - 在 Javascript 中通过多个 if 语句运行 While 循环

iphone - Phonegap 应用程序 : External URL don't open in InApp Browser of IOS