【问题标题】:Alternative to overloading the assignment operator in Swift在 Swift 中重载赋值运算符的替代方法
【发布时间】:2015-07-16 04:20:22
【问题描述】:

我正在从头开始创建一个字符串结构(称为ScalarString),它内部是一个UInt32 Unicode 标量值数组(有关背景,请参阅this question)。

对于普通的 Swift String,我可以执行以下操作:

let myString: String = "hello"

我想做

let myScalarString: ScalarString = "hello"

我在 overload 分配 operator 以在幕后将“你好”String 自动转换为 ScalarString。但是,this SO Q&A 告诉我这是不可能的。

我可以写一个类似的方法

myScalarString.set("hello")

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

myScalarString = "hello"

【问题讨论】:

    标签: string swift operator-overloading


    【解决方案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)
        }
    
    }
    

    【讨论】:

    • 所以这仅允许在初始化期间对字符串(或数组)文字(不是变量)进行赋值,对吗?也就是说,我不能做类似let myString = ScalarString() 的事情来初始化一个空字符串,然后用myString = "hello" 设置值。
    • 如果我上面的陈述是正确的,那么 Swift 将这个功能赋予它自己的 String 结构体的特殊魔法是什么?
    • @Suragch: var myString = ScalarString() ; ... ; myString = "hello" 应该可以使用上述扩展。 – Swift 编译器可以做很多我们做不到的事情(例如,必要时自动将 Int、Double、String 等转换为 NSObject)。
    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 2012-08-17
    • 2011-02-21
    • 2012-04-22
    • 2015-06-01
    • 2011-01-27
    • 2011-05-31
    • 2013-01-21
    相关资源
    最近更新 更多