我正在寻找一种在初始化期间处理无效参数的正确方法。
我不确定如何使用Swift来执行它,因为init没有返回类型。如何判断谁正在尝试初始化这个类,你做错了什么?
init (timeInterval: Int) {
if timeInterval > 0
self.timeInterval = timeInterval
else
//???? (return false?)
}
谢谢!
答案 0 :(得分:19)
使用可用的初始化程序。这样的初始化程序看起来非常类似于常规的指定初始化程序,但有一个'?' init
之后的字符,并且可以返回nil
。可用的初始值设定项创建一个可选值。
struct Animal {
let species: String
init?(species: String) {
if species.isEmpty { return nil }
self.species = species
}
}
答案 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
}