根据Swift - Converting String to Int,String
方法toInt()
。
但是,没有toUInt()
方法。那么,如何将String
转换为Uint
?
答案 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