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

Swift 处理失败初始化的正确方法,swift,ios8,Swift,Ios8,我正在寻找一种在初始化过程中处理无效参数的正确方法 我不确定如何使用Swift,因为init没有返回类型。我怎样才能告诉试图初始化这个类的人你做错了什么 init (timeInterval: Int) { if timeInterval > 0 self.timeInterval = timeInterval else //???? (return false?) } 谢谢大家! 在swift中,您不能在任务执行的中途中止任务。在swif

我正在寻找一种在初始化过程中处理无效参数的正确方法

我不确定如何使用Swift,因为init没有返回类型。我怎样才能告诉试图初始化这个类的人你做错了什么

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

谢谢大家!

在swift中,您不能在任务执行的中途中止任务。在swift中也没有例外,总的来说,中止一项任务是危险的,并且会导致错误,所以不应该这样做

因此,您可以验证如下值:

assert(timeInterval > 0)
如果提供了无效值,将终止程序

您还应该将
timeInterval
更改为
UInt
,这样,如果有人试图给出
<0
值或可能<0的整数值,就会出现编译器错误


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

在Apple的Swift book中,在本节的最底部:

他们说:

何时使用断言

当条件可能为假时,使用断言, 但必须是真的才能让代码继续 执行。断言检查的合适场景包括:

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

这听起来很像你的处境

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

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

    // Continue your execution normally
}

我认为这是最好的解决方案,它来自:

类号不超过十个{
var-mySmallNumber:Int?
类func instanceOrNil(number:Int)->NumberLessThanTen{
如果数字小于10{
返回编号不超过十(编号:number)
}否则{
归零
}
}
@必需的init(){
}
初始化(编号:Int){
self.mySmallNumber=number
}
}
设iv=numberness大于10.instanceOrNil(17)//nil
设v=NumberLessThanTen.instanceOrNil(5)//有效实例
让n=v!。mySmallNumber//大约5
使用可失效的初始值设定项。这样的初始值设定项看起来与常规指定的初始值设定项非常相似,但在
init
之后有一个“?”字符,并且允许返回
nil
。可失败的初始值设定项创建可选值

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

有关更多详细信息,请参阅。

我想说通过使
timeInterval
unsigned来强制它?或者你必须声明它..使它不签名可以解决这个特殊的情况,但是没有其他的。资产听起来像是一种选择。这有点糟糕…你可以用一个类函数。看,很好!此外,如果你想在应用程序失败时终止应用程序,你也可以为你的断言提供一条消息,就像错误消息一样。然而,在许多情况下,这是不合适的。如果用户试图创建一个参数无效的实例,我可能希望通知该用户,而不是使应用程序崩溃。@在swift中编写代码您永远不会无法初始化对象。在调用init之前,必须检查可能导致失败的任何内容,如果有人未能这样做,则assert将用于使应用程序崩溃。不知道为什么这会被否决,但baile初始值设定项是有条件地创建对象的一种很好的方法。
struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}