我想覆盖' =' CGFloat的运算符,如下面的尝试:
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<style>
.nodisplay
{
display:none;
}
</style>
<input type="file" class="nodisplay">
<div class="nodisplay">lol</div>
所以我可以做以下事情:
func = (inout left: CGFloat, right: Float) {
left=CGFloat(right)
}
可以这样做吗?我收到错误var A:CGFloat=1
var B:Float=2
A=B
答案 0 :(得分:28)
这是不可能的 - 如documentation:
中所述无法重载默认赋值运算符(=)。只有复合赋值运算符才能重载。同样,三元条件运算符(a?b:c)也不能重载。
如果这不能说服你,只需将操作符更改为+=
:
func +=(left: inout CGFloat, right: Float) {
left += CGFloat(right)
}
你会注意到你不会再收到编译错误。
误导性错误消息的原因可能是因为编译器正在解释您作为赋值重载的尝试
答案 1 :(得分:10)
您无法覆盖分配,但您可以在案例中使用不同的运算符。例如&=
运算符。
func &= (inout left: CGFloat, right: Float) {
left = CGFloat(right)
}
所以你可以做到以下几点:
var A: CGFLoat = 1
var B: Float = 2
A &= B
顺便说一句,操作符&+
,&-
,&*
存在于swift中。它们代表C风格的操作而没有溢出。 More
答案 2 :(得分:0)
这不是 operator loading
方法。但结果可能如你所愿
// 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)