我想要重载CGFloat的'='运算符,类似于以下尝试:
func = (inout left: CGFloat, right: Float) {
left=CGFloat(right)
}
那么我可以这样做:
var A:CGFloat=1
var B:Float=2
A=B
能做到吗?我得到了错误信息:通过将“_”赋值给忽略闭包的结果来显式丢弃结果
我想要重载CGFloat的'='运算符,类似于以下尝试:
func = (inout left: CGFloat, right: Float) {
left=CGFloat(right)
}
那么我可以这样做:
var A:CGFloat=1
var B:Float=2
A=B
能做到吗?我得到了错误信息:通过将“_”赋值给忽略闭包的结果来显式丢弃结果
正如文档所述,这是不可能的:
默认赋值运算符 (=) 无法被重载,只有复合赋值运算符可以被重载。同样地,三元条件运算符 (a ? b : c) 也无法被重载。
如果这还不能说服您,请将运算符更改为 +=
:
func +=(left: inout CGFloat, right: Float) {
left += CGFloat(right)
}
你会注意到,你将不再收到编译错误。
这个误导性的错误信息出现的原因可能是编译器将你的重载尝试解释为一种赋值。
您无法覆盖赋值,但可以在您的情况下使用不同的运算符。例如,&=
运算符。
func &= (inout left: CGFloat, right: Float) {
left = CGFloat(right)
}
那么你可以做如下操作:
var A: CGFLoat = 1
var B: Float = 2
A &= B
顺便提一下,在Swift中有运算符&+
、&-
和&*
,它们表示C风格的操作而没有溢出。 更多信息
这不是 运算符重载
的方法。但结果可能是您期望的。
// 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)
+=
等)。 - Antonio