在Swift中重载赋值操作符的替代方法



我正在从头开始制作一个字符串结构体(称为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)
    }
}

最新更新