所以,我有一个关于我的类和结构接口在Swift中应该是什么样子的问题。 例如,我有一个类或结构,它有方法:
func getAllObjectsFromSomewhere() -> [Int]
但是,想象一下这个方法并不总是返回一些Int数组,所以几乎没有办法处理它。
func getAllObjectsFromSomewhere() -> [Int]?
func getAllObjectsFromSomewhere() throws -> [Int]
使用以下类型引用自定义ErrorType:NotFound或EmptyArray func getAllObjectsFromSomewhere() -> [Int] { /* some code and then just return an empty Int array */ return [Int]() }
所以,我的问题是,何时以及为什么我应该采用哪种方法来组织界面?这有什么不同吗?有没有指导方针?
答案 0 :(得分:2)
根据具体情况,所有这三种方法都是有效的:
[Int]?
。这使您可以区分空数组和根本没有数组。throws
[Int]
和空数组。答案 1 :(得分:1)
这只是我的意见,我没有任何指导或任何东西可以抛弃它,但是......
开箱即用我认为这是选项的完美案例,这意味着这个签名:
func getAllObjectsFromSomewhere() -> [Int]?
但是(一如既往:))这取决于具体情况。以下是我对您的方案的看法。
如果我要实现该功能,这就是我通常使用的。
您有一个正常的情况,您希望在数组中返回一些Int
。
如果由于某种原因没有元素,那么您会收到nil
作为回报,然后您可以使用guard
或if let
进行检查。
通常情况下,空数组不足以成为实际开始抛出异常的理由,但当然这取决于具体情况。
但是,如果你真的希望你的getAllObjectsFromSomewhere
必须返回一个值,那么如果由于某些原因没有任何内容,则抛出错误是有意义的返回。
这是我最不喜欢的解决方案。
当你调用getAllObjectsFromSomewhere
时,你还需要检查一下,看看返回的数组是否确实包含任何内容(if getAllObjectsFromSomewhere().count > 0
),然后再决定做什么....为什么不使用{{ 1}}或guard
为此?
如上所述,这只是我对这三种情况的看法,希望你能使用它们。