我正在从头开始制作一个字符串结构体(称为ScalarString
),内部是UInt32
Unicode标量值的数组(参见此问题的背景)。
对于一个正常的Swift String
,我可以做以下操作:
let myString: String = "hello"
我想做
let myScalarString: ScalarString = "hello"
重载赋值操作符,以便在后台将"hello"String
自动转换为ScalarString
。然而,这个问题告诉我这是不可能的。
myScalarString.set("hello")
,但它不如赋值操作符可读。还有别的办法吗?
myScalarString = "hello"
赋值
let myScalarString: ScalarString = "hello"
与右边的字符串字面值一起使用,这就足够了为您的类型实现StringLiteralConvertible
:
extension ScalarString : StringLiteralConvertible {
init(stringLiteral value: String) {
self.init(value)
}
init(extendedGraphemeClusterLiteral value: String) {
self.init(value)
}
init(unicodeScalarLiteral value: String) {
self.init(value)
}
}
然而,这只适用于字符串字面量,而不适用于任意字符串,所以这不能编译:
let str = "hello"
let yourScalarString: ScalarString = str
,因为(正如您已经注意到的)您不能重载赋值操作符,并且必须显式地使用init方法:
let yourScalarString = ScalarString(str)
以同样的方式,您可以创建您的类型的值从Unicode值的字面值数组
let myScalarString: ScalarString = [ 65, 66, 67 ]
通过实现ArrayLiteralConvertible
协议:
extension ScalarString : ArrayLiteralConvertible {
init(arrayLiteral elements: UInt32...) {
self.init(elements)
}
}