【问题标题】:ascii to string swift 3 problemsascii to string swift 3 问题
【发布时间】:2016-10-20 20:16:27
【问题描述】:

在以前版本的 swift 中,以下代码有效。

let letterString = String( UnicodeScalar( 97 ) )
print( letterString )

返回“a”

升级到 swift 3 后,它建议我更改为

let letterString = String( describing: UnicodeScalar( 97 ) )
print( letterString )

返回可选的(“a”)

好的,所以我尝试添加 !运算符解包,但它不起作用。

let letterString = String( describing: UnicodeScalar( 97 ) )
print( letterString! )

给出错误:无法强制解开非可选类型“字符串”的值

谁能告诉我这里发生了什么?如何从 Swift 3 中的 ascii 值中获取未包装的字符串值?

【问题讨论】:

标签: swift string ascii


【解决方案1】:

不是String 实例是可选的。这是UnicodeScalar 结构。所以你必须打开那个:

let letterString = String(describing: UnicodeScalar(97)!)
print(letterString)

另一种方法是使用UnicodeScalars 其他初始化程序。那么你根本不需要打开它。

let letterString2 = String(describing: UnicodeScalar(UInt8(97)))
print(letterString)

【讨论】:

  • 请注意,解包UnicodeScalar后,您可以使用String(_:)初始化器,而不是String(describing:)
【解决方案2】:

包裹在可选项中的是您的 Unicode 标量。您需要打开它才能打印“a”。您当前的可选值实际上被放入一个名为 'Optional("a")' 的字符串中。

let letterString = String( describing: UnicodeScalar( 97 )! )
print( letterString )

【讨论】:

    【解决方案3】:

    您可以通过使用扩展来方便地做您想做的事:

    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" 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多