我该如何处理参数验证Swift

时间:2014-06-16 19:00:18

标签: swift

我正在学习斯威夫特。我正在设计一个需要在其初始化程序中进行参数验证的类。如果传递的值超出范围,我该如何处理?考虑到这一点,我真的很难找到一种合适的设计方法:

  • Swift没有例外,在有异常的语言和内置的try / catch机制中,我会抛出异常。
  • Swift不允许从初始化程序返回nil / null / nothing来指示错误情况,就像我们在Objective-C中所做的那样。
  • 我觉得将NSErrorPointer传递给初始化程序很麻烦,给类的使用者带来了不必要的负担。

如何在Swift中验证初始化程序的参数?

3 个答案:

答案 0 :(得分:3)

您可以使用类函数来完成。见下文。有两点需要注意 - 类函数必须返回Self?不是Self,允许nil返回,并且类必须有一个@required init()。

class Validate {
    class func instanceOrNil(valid: Bool) -> Self? {
        if valid {
            return self()
        } else {
            return nil
        }
    }
    @required init() {
    }
}

let iv = Validate.instanceOrNil(false) // nil
let v = Validate.instanceOrNil(true) // Validate instance

实际的“实际”示例可能看起来更像

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

答案 1 :(得分:3)

现在使用Swift 2.0可以抛出异常。例如:

enum Parameter: ErrorType {
    case Empty
    case Short
}

然后在你的功能中你可以使用超级有用的守卫来检查收到的东西是否有效并做这样的事情:

guard parameter.characters.count > 0 else { throw Parameter.Empty }

然后你必须抓住这些例外:

do {
    // call your method with try for example something like 'let var = try MyClass("test")'
} catch .Empty {

} catch .Short {

} catch {
    print("Something else went wrong!")
}

答案 2 :(得分:0)

一种技巧:创建一个包含初始化程序并返回可选Thing.createThing( ... )的{​​{1}}类方法。在该方法中执行验证:如果参数通过验证,请使用它们调用初始化程序并返回结果。如果验证失败,请返回Thing?