设计中的选项 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,否则您可能会过度设计实际上并不那么复杂的东西。
作为一个(有点做作的)示例,您可以满足以下两个要求:
一个函数,它 return 是 Int 数组中的质数数组:
func primeNumberFromIntegers(integers: [Int]) -> [Int] {
// implementation goes here
}
如果您知道您将总是想要遍历return编辑的任何数字,那是没有意义的有一个可选的 return 值,但函数 return 是一个空数组。
您可能需要一个函数来 return 来自整数数组的 最高 可用素数这可能更有意义:
func highestPrimeNumberFromIntegers(integers: [Int]) -> Int? {
//Implementation
}
为什么可选?因为您在 中发送的整数数组可能 或可能 不 包含任何质数。如果不存在质数,唯一的 合理 return 值是 nil。
我正在创建一个新的 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,否则您可能会过度设计实际上并不那么复杂的东西。
作为一个(有点做作的)示例,您可以满足以下两个要求:
一个函数,它 return 是 Int 数组中的质数数组:
func primeNumberFromIntegers(integers: [Int]) -> [Int] { // implementation goes here }
如果您知道您将总是想要遍历return编辑的任何数字,那是没有意义的有一个可选的 return 值,但函数 return 是一个空数组。
您可能需要一个函数来 return 来自整数数组的 最高 可用素数这可能更有意义:
func highestPrimeNumberFromIntegers(integers: [Int]) -> Int? { //Implementation }
为什么可选?因为您在 中发送的整数数组可能 或可能 不 包含任何质数。如果不存在质数,唯一的 合理 return 值是 nil。