在Swift

时间:2017-06-19 14:23:03

标签: swift optional

在我看来,应该有一种简单的方法可以在Swift中从StringInt进行可选转换,但我无法弄明白。

valueString?,我需要返回Int?

基本上我想这样做,但没有样板:

return value != nil ? Int(value) : nil

我试过这个,这似乎符合Swift的惯例,并且很简洁,但是它不能识别语法:

return Int?(value)

3 个答案:

答案 0 :(得分:9)

您可以使用Optional的{​​{3}}方法:

func foo(_ value: String?) -> Int? {
    return value.flatMap { Int($0) }
}

如果value == nil,则flatMap会返回nil。否则它 评估Int($0) $0解包的值, 并返回结果(如果转换失败,则可以是nil):

print(foo(nil) as Any)      // nil
print(foo("123") as Any)    // Optional(123)
print(foo("xyz") as Any)    // nil

答案 1 :(得分:7)

您可以使用 nil coalescing operator ??来展开String?并使用您知道会生成""的默认值nil

return Int(value ?? "")

另一种方法:采用String?

的Int初始值设定项

来自评论:

  

对我来说很奇怪,初始化程序不接受可选项,如果传入任何nil则只返回nil。

您可以为Int创建自己的初始化程序,只执行以下操作:

extension Int {
    init?(_ value: String?) {
        guard let value = value else { return nil }
        self.init(value)
    }
}

现在你可以这样做:

var value: String?
return Int(value)

答案 2 :(得分:3)

使用String扩展名时,您不必担心string == nil

extension String {
  func toInt() -> Int? {
    return Int(self)
  }
}

用法:

var nilString: String?
print("".toInt())         // nil
print(nilString?.toInt()) // nil
print("123".toInt())      // Optional(123)