设计Swift API的选项

时间:2016-06-02 03:50:24

标签: swift optional api-design

我正在创建一个在我的应用中使用的新API。 Swift API指南未提及可选项。

我已经构建了我的API,以接受一种格式的数据,并以另一种格式返回,以便在创建中使用。即

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

该函数检查数据是否为零,并进行适当的处​​理。在写完之后,我发现API应该只处理非选项,用户应该在传递之前检查nil。我们决定了一条规则吗?

2 个答案:

答案 0 :(得分:2)

不是"规则"为了这。这取决于您的应用的运作方式。在您的情况下,您正在尝试创建一个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对象,所以在这种情况下你不能让它可以为空。

答案 1 :(得分:0)

这取决于您的使用案例。我说一个好的经验法则是根据您当前的需求设计您的API,否则您可能会过度设计那些实际上并不复杂的事情。

作为一个(有点人为的)例子,你可以举例说明以下两个要求:

  1. 从Ints数组中返回素数数组的函数:

    $query="INSERT INTO tbl_test SET name='abc'";
    
  2. 如果您知道总是希望迭代返回的任何数字,那么就没有可选的返回值,而是让函数返回一个空数组。

    1. 您可能需要一个函数从Ints数组中返回最高可用的素数,这可能更有意义:

      INSERT INTO
    2. 为什么选择?因为您在中发送的Ints数组可能包含任何素数。如果不存在素数,则唯一的敏感返回值为nil。