设计中的选项 Swift API

Optionals in designing Swift API

我正在创建一个新的 API 以在我的应用中使用。 Swift API 指南没有提及可选值。

我已将我的 API 结构化为接受一种格式的数据,并 return 接受另一种格式的数据以用于创建。即

func createMyDataFromYourData(data: YourData?) -> MyData? {}

该函数检查数据是否为零,并适当地进行。写完这篇文章后,我突然想到 API 应该只处理非可选值,用户应该在通过之前检查是否为 nil。我们决定好规则了吗?

这里没有 "rule"。这取决于您的应用程序的工作方式。在你的例子中,你正在尝试创建一个 MyData 对象,所以我建议你改为:

class MyData {
    convenience init?(data: YourData?) {
        guard let data = data else { return nil }

        self.init()

        // Do whatever with data
    }
}

这样当你这样调用它时很明显你正在创建一个新对象:

let obj = MyData(data: yourDataObject)

obj 本身就是一个可为空的对象。如果 YourData 为 nil,您仍然有可能创建一个 MyData 对象,因此在这种情况下,您不会将其设置为可空。

真的不可能有任何关于此的一般规则。这取决于您的用例。我想说一个好的经验法则是根据您当前的需求设计 API,否则您可能会过度设计实际上并不那么复杂的东西。

作为一个(有点做作的)示例,您可以满足以下两个要求:

  1. 一个函数,它 return 是 Int 数组中的质数数组:

    func primeNumberFromIntegers(integers: [Int]) -> [Int] {
        // implementation goes here
    }
    

如果您知道您将总是想要遍历return编辑的任何数字,那是没有意义的有一个可选的 return 值,但函数 return 是一个空数组。

  1. 您可能需要一个函数来 return 来自整数数组的 最高 可用素数这可能更有意义:

    func highestPrimeNumberFromIntegers(integers: [Int]) -> Int? {
        //Implementation
    }
    

为什么可选?因为您在 中发送的整数数组可能 或可能 包含任何质数。如果不存在质数,唯一的 合理 return 值是 nil。