替代在Swift中重载赋值运算符

时间:2015-07-16 04:20:23

标签: string swift operator-overloading

我从头开始创建一个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"

但这不像赋值运算符那样可读。还有其他选择吗?

"*.*"

1 个答案:

答案 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)
    }

}