Swift:如何将String转换为UInt?

时间:2015-05-21 19:12:34

标签: string swift type-conversion uint

根据Swift - Converting String to IntString方法toInt()

但是,没有toUInt()方法。那么,如何将String转换为Uint

5 个答案:

答案 0 :(得分:13)

Swift 2 / Xcode 7的更新:

从Swift 2开始,所有整数类型都有一个(可用的)构造函数

init?(_ text: String, radix: Int = default)

取代了toInt()的{​​{1}}方法,因此没有自定义 此任务不再需要代码:

String

Swift 1.x的旧答案:

这看起来有点复杂,但应该适用于所有数字 全范围print(UInt("1234")) // Optional(1234) // This is UInt.max on a 64-bit platform: print(UInt("18446744073709551615")) // Optional(18446744073709551615) print(UInt("18446744073709551616")) // nil (overflow) print(UInt("1234x")) // nil (invalid character) print(UInt("-12")) // nil (invalid character) ,并正确检测所有可能的错误 (例如溢出或尾随无效字符):

UInt

<强>说明:

  • BSD库函数strtoul用于转换。 extension String { func toUInt() -> UInt? { if contains(self, "-") { return nil } return self.withCString { cptr -> UInt? in var endPtr : UnsafeMutablePointer<Int8> = nil errno = 0 let result = strtoul(cptr, &endPtr, 10) if errno != 0 || endPtr.memory != 0 { return nil } else { return result } } } } 在输入字符串中设置为第一个“无效字符”, 因此,如果所有字符,则必须保留endPtr 可以转换。 在转换错误的情况下,设置全局endPtr.memory == 0变量 为非零值(例如errno表示溢出)。

  • 由于ERANGE接受,因此必须进行减号测试 负数(用无符号转换为无符号数) 相同的位模式)。

  • 当Swift字符串被“幕后”转换为C字符串时 传递给一个带有strtoul()参数的函数,所以可以 试着打电话给char *(这就是我所做的 这个答案的第一个版本)。问题是自动的 创建的C字符串只是临时的,可能已经无效了 strtoul(self, &endPtr, 0)会返回,因此strtoul()不会指向 输入字符串中的字符了。这发生在我在Playground中测试代码时。使用endPtr时,不会发生此问题,因为C字符串在整个执行过程中都有效 关闭。

一些测试:

self.withCString { ... }

答案 1 :(得分:4)

您可能对以下类似的更安全的解决方案感兴趣:

let uIntString = "4"
let nonUIntString = "foo"

extension String {
    func toUInt() -> UInt? {
        let scanner = NSScanner(string: self)
        var u: UInt64 = 0
        if scanner.scanUnsignedLongLong(&u)  && scanner.atEnd {
            return UInt(u)
        }
        return nil
    }
}

uIntString.toUInt()     // Optional(4)
nonUIntString.toUInt()  // nil

希望这有帮助

//编辑以下@Martin R.建议

答案 2 :(得分:3)

请注意,对于不崩溃的爱,请不要使用!来执行此操作。

map末尾添加toInt以将其转换为可选的UInt很容易:

let str = "4"
let myUInt = str.toInt().flatMap { $0 < 0 ? nil : UInt($0) }

然后在myUInt上使用the usual unwrapping techniques

如果你发现自己做了很多这样的事情:

extension String {
    func toUInt() -> UInt? {
        return self.toInt().flatMap { $0 < 0 ? nil : UInt($0) }
    }
}

let str = "-4"
if let myUInt = str.toUInt() {
    println("yay, \(myUInt)")
}
else {
    println("nuh-uh")
}

编辑:正如@MartinR指出的那样,虽然安全,但这并未提取UInt未涵盖的Int的所有可能值,请参阅其他两个答案。< / p>

答案 3 :(得分:0)

使用强制解包或可选绑定来确保字符串可以转换为UInt。 例如:

let string = "123"
let number = UInt(string) //here number is of type *optional UInt*

//Forced Unwrapping

if number != nil {
  //converted to type UInt
}

答案 4 :(得分:-1)

只需使用UInt的初始化:

let someString = "4"

UInt(someString.toInt()!) // 4