Swift: 可选的编码规则。 swift 返回 nil 或 [] 的样式

Swift: Coding rule of optional. Which is swift's style returning nil or []

我在模型 classes 中有一些查找方法。当数据为空时,返回 nil 或 [](empty array) 哪个更好。请看下面。我认为 (2) 更好,因为我不需要 nil 检查。

(1) nil

func findAll() -> [Sample]? {
    return nil
}

if let results = DataManager().findAll() {
    self.results = results
}

(2) empty arrray

func findAll() -> [Sample] {
    if results.count > 0 {
      return results
    }
    return []
}

self.results    = DataManager().findAll()

更新

我更改了模型 class 的方法。

(1) nil

func findAll() -> [Sample]? {
    var results = context.executeFetchRequest(request, error: &error) as [Sample]
    if results.count > 0 {
      return results
    }
    return nil
}

if let results = DataManager().findAll() {
    self.results = results
}

(2) empty arrray

func findAll() -> [Sample] {
    var results = context.executeFetchRequest(request, error: &error) as [Sample]
    if results.count > 0 {
      return results
    }
    return []
}

self.results    = DataManager().findAll()

Optional 是增强现有类型以表达 "there isn't one".

的好方法

集合、数组和树等集合已经具有这种能力——空集合。

return [] 从 return 集合类型的函数是完全合法的。特别是在你上面给出的情况下,因为如果问题真的是 'how many are there',那么 [].count 等于 0,这是正确的,但是 Optional.None<Thing>?.count 会 return Optional<Int>.None;这并不能准确代表成员数量。

Optional.None 等同于 Objective-c 的 nil 但有类型检查。


您也可以(并且应该)将 Optional 视为集合的特例!它是一个集合,可以包含零 (None) 或 (Some 或只是) 所讨论的事物之一 - 仅此而已。

所以对于 find 的类似方法 return 是第一个匹配元素,或者 none,Optionals 是合适的,因为 find 只需要 return 一件事,仅此而已,或者什么都没有。