如何在Swift中重载赋值运算符

29

我想要重载CGFloat的'='运算符,类似于以下尝试:

func = (inout left: CGFloat, right: Float) {
    left=CGFloat(right)
}

那么我可以这样做:

var A:CGFloat=1
var B:Float=2
A=B

能做到吗?我得到了错误信息:通过将“_”赋值给忽略闭包的结果来显式丢弃结果


3
你不能重载赋值运算符,只能重载复合赋值运算符(例如+=等)。 - Antonio
1
@Antonio是正确的,这里是参考链接:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html - Dániel Nagy
3个回答

34

正如文档所述,这是不可能的:

默认赋值运算符 (=) 无法被重载,只有复合赋值运算符可以被重载。同样地,三元条件运算符 (a ? b : c) 也无法被重载。

如果这还不能说服您,请将运算符更改为 +=

func +=(left: inout CGFloat, right: Float) {
    left += CGFloat(right)
}

你会注意到,你将不再收到编译错误。

这个误导性的错误信息出现的原因可能是编译器将你的重载尝试解释为一种赋值。


12

您无法覆盖赋值,但可以在您的情况下使用不同的运算符。例如,&= 运算符。

func &= (inout left: CGFloat, right: Float) {
    left = CGFloat(right)
}

那么你可以做如下操作:

var A: CGFLoat = 1
var B: Float = 2
A &= B

顺便提一下,在Swift中有运算符&+&-&*,它们表示C风格的操作而没有溢出。 更多信息


1

这不是 运算符重载 的方法。但结果可能是您期望的。

// Conform to `ExpressibleByIntegerLiteral` and implement it
extension String: ExpressibleByIntegerLiteral {
    public init(integerLiteral value: Int) {
        // String has an initializer that takes an Int, we can use that to
        // create a string
        self = String(value)
    }
}

extension Int: ExpressibleByStringLiteral {
    public init(stringLiteral value: String) {
        self = Int(value) ?? 0
    }
}

// No error, s2 is the string "4"
let s1: Int = "1"
let s2: String = 2

print(s1)
print(s2)
print(s1 + 2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接