在以前版本的swift中,以下代码有效。
let letterString = String( UnicodeScalar( 97 ) )
print( letterString )
返回“a”
升级到swift 3后,建议我改为
let letterString = String( describing: UnicodeScalar( 97 ) )
print( letterString )
返回Optional(“a”)
好的,所以我尝试添加!操作员打开但不起作用。
let letterString = String( describing: UnicodeScalar( 97 ) )
print( letterString! )
给出错误:无法强制解包非可选类型'String'的值
谁能告诉我这里发生了什么?如何从Swift 3中的ascii值获取一个解包的String值?
答案 0 :(得分:3)
String
实例不是可选的。这是UnicodeScalar
结构。所以你必须打开那个:
let letterString = String(describing: UnicodeScalar(97)!)
print(letterString)
另一种方法是使用UnicodeScalar
其他初始值设定项。然后你根本不需要打开它。
let letterString2 = String(describing: UnicodeScalar(UInt8(97)))
print(letterString)
答案 1 :(得分:1)
包含在可选项中的是您的Unicode标量。你需要解开它以打印" a"。您当前的可选值实际上被放入一个名为' Optional(" a")'。
的字符串中。let letterString = String( describing: UnicodeScalar( 97 )! )
print( letterString )
答案 2 :(得分:1)
使用扩展程序,您可以通过一些方便来做您想做的事情:
extension String.UnicodeScalarView {
public init<S: Sequence>(ascii: S) where S.Iterator.Element == UInt8 {
var _self = String.UnicodeScalarView()
_self.append(contentsOf: ascii.map(UnicodeScalar.init))
self = _self
}
public init(ascii: UInt8...) {
self.init(ascii: ascii)
}
}
extension String {
public init(ascii: UInt8...) {
self = String(UnicodeScalarView(ascii: ascii))
}
}
let letterString = String(ascii: 97)
第一个初始值设定项采用UInt8
值的任意序列,并从中创建String.UnicodeScalarView
。
第二个和第三个只是一个便利捷径,允许这样的事情:
let abc = String(ascii: 97, 98, 99) // "abc"