Swift: 如何转换字符串 UInt?

根据
https://coderoad.ru/24115141/
, 有一种方法
String


toInt//

.

但没有方法
toUInt//

. 所以如何转换
String


Uint

?
已邀请:

冰洋

赞同来自:

更新 Swift 2/Xcode 7

:

以。。。开始 Swift 2, 所有整数类型都有 /故障转移/ 构造函数


init?/_ text: String, radix: Int = default/


替换该方法
toInt//


String

, 所以
对于此任务,不再需要用户代码:


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/


旧答案 Swift 1.x

:

它看起来有点困难,但应该为所有数字工作
全系列
UInt

并正确检测到所有可能的错误
/例如,溢出或 trailing 符号无效/:


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, &amp;endPtr, 10/
if errno != 0 || endPtr.memory != 0 {
return nil
} else {
return result
}
}
}
}


评论

:

库函数用于转换
https://developer.apple.com/li ... .html
strtoul

.
endPtr

有意思 first "invalid character" 在输入行中
所以
endPtr.memory == 0

必须保存如果

全部

符号
可以转换。
在转换错误全局变量的情况下
errno

安装了
在非零值中 /例如,
ERANGE

溢出/.

对于负符号的测试是必要的,因为
strtoul//

接受
负数 /将其转换为无符号数
相同的位模板/.

线 Swift 转变为一个字符串 C "behind the scenes" 为了
转移函数接受参数
char *

, 所以这是可能的
打电话的诱惑
strtoul/self, &amp;endPtr, 0/

/我做了什么
这个答案的第一个版本/. 问题是自动
创建字符串 C 只是暂时的,可能已经无效
返回
strtoul//

, 以便
endPtr

不再表明
输入线中的符号。 当我在操场上测试代码时发生了这种情况。 从
self.withCString { ... }

由于字符串不会发生此问题 C 在整个履行中有效
电路。

一些测试:


println/"1234".toUInt/// // Optional/1234/
// This is UInt.max on a 64-bit platform:
println/"18446744073709551615".toUInt/// // Optional/18446744073709551615/
println/"18446744073709551616".toUInt/// // nil /overflow/
println/"1234x".toUInt/// // nil /invalid character/
println/"-12".toUInt/// // nil /invalid character/


</int8>

知食

赞同来自:

也许你对一个更安全的决定感兴趣,类似于:


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. 句子

快网

赞同来自:

请因为爱而不是崩溃,不要为此使用
!

.

轻松附加
map

到底
toInt

, 将其转换为可选
UInt

:


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


然后使用


myUInt

.

如果你发现你经常做什么:


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"/
}


edit: 如..所示 @MartinR, 虽然它是安全的,但它没有提取完整范围的可能值
UInt

, 哪一个
Int

没有封面,看到另外两个答案。

知食

赞同来自:

使用强制部署或可选绑定以确保可以转换字符串 UInt.
opd:。


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

//Forced Unwrapping

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

裸奔

赞同来自:

刚使用 UInt init:


let someString = "4"

UInt/someString.toInt//!/ // 4

要回复问题请先登录注册