我从头开始创建一个String结构(称为ScalarString
),内部是UInt32
Unicode标量值的数组(有关背景,请参阅this question)。
对于正常的Swift String
,我可以执行以下操作:
let myString: String = "hello"
我想做
let myScalarString: ScalarString = "hello"
我overload的作业operator将“hello”String
自动转换为ScalarString
幕后的myScalarString.set("hello")
。但是,this SO Q&A告诉我这是不可能的。
我可以写一个类似
的方法myScalarString = "hello"
但这不像赋值运算符那样可读。还有其他选择吗?
"*.*"
答案 0 :(得分:1)
进行作业
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)
}
}