ascii to string swift 3问题

时间:2016-10-20 20:16:27

标签: swift string ascii

在以前版本的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值?

3 个答案:

答案 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"