正确处理初始化失败的方法

时间:2014-06-18 22:03:22

标签: swift ios8

我正在寻找一种在初始化期间处理无效参数的正确方法。

我不确定如何使用Swift来执行它,因为init没有返回类型。如何判断谁正在尝试初始化这个类,你做错了什么?

init (timeInterval: Int) {
    if timeInterval > 0
        self.timeInterval = timeInterval
    else
        //???? (return false?)
}

谢谢!

4 个答案:

答案 0 :(得分:19)

使用可用的初始化程序。这样的初始化程序看起来非常类似于常规的指定初始化程序,但有一个'?' init之后的字符,并且可以返回nil。可用的初始值设定项创建一个可选值。

struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}

有关详细信息,请参阅Apple's documentation on failable initializers

答案 1 :(得分:3)

在swift中,你无法在执行中途中止任务。 swift中没有例外,一般来说,哲学是中止任务是危险的并导致错误,所以不应该这样做。

因此,您验证了这样的值:

assert(timeInterval > 0)

如果提供的值无效,将终止该程序。

您还应该将timeInterval更改为UInt,以便在任何人尝试提供< 0值或可能为&lt; 1的整数值时会出现编译器错误。 0

这可能不是您正在寻找的答案。但目标是尽早检查错误的参数,这意味着在之前使用这些参数创建任何对象。理想情况下,检查应该在编译时完成,但这并不总是有效。

答案 2 :(得分:2)

我认为这是最佳解决方案,取自:How should I handle parameter validation Swift

class NumberLessThanTen {
    var mySmallNumber: Int?
    class func instanceOrNil(number: Int) -> NumberLessThanTen? {
        if number < 10 {
            return NumberLessThanTen(number: number)
        } else {
            return nil
        }
    }
    @required init() {
    }
    init(number: Int) {
        self.mySmallNumber = number
    }
}

let iv = NumberLessThanTen.instanceOrNil(17) // nil
let v = NumberLessThanTen.instanceOrNil(5) // valid instance
let n = v!.mySmallNumber // Some 5

答案 3 :(得分:1)

在Apple的Swift书中,在本节的最底部:https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_399

他们说:

  

何时使用断言

     

只要条件可能为假,就使用断言,   但必须确保您的代码能够继续使用   执行。适用于断言检查的场景包括:

     

将整数下标索引传递给自定义下标   实现,但下标索引值可能太低或太低   高。值传递给函数,但无效值表示   该功能无法完成其任务。目前是可选值   nil,但非零值对后续代码的执行至关重要   成功。

这听起来像你的情况完全

因此,您的代码应如下所示:

init (timeInterval: Int) {
    assert (timeInterval > 0, "Time Interval Must be a positive integer")

    // Continue your execution normally
}