最近在网上看到一道比较有意思的面试题,在JavaScript中a == 1 && a == 2 && a == 3
这个表达式的结果是否有可能为true?作者在JavaScript中给出了好几种答案。
于是就想到如何在Swift中,让这个表达式为true呢?
思路一:重载操作符
首先自定义一个对象,里面有一个value,然后自定义操作符,在进行比较的时候对对象里的value进行加1
class Number {
var value: Int
init(value: Int) {
self.value = value
}
}
func == (lhs: Number, rhs: Int) -> Bool {
let leftValue = lhs.value
lhs.value += 1
return leftValue == rhs
}
let a = Number(value: 1)
print(a == 1 && a == 2 && a == 3)
复制代码
这个方法也可以不用自定义对象,通过指针也可以,代码如下
func == (lhs: UnsafeMutablePointer<Int>, rhs: Int) -> Bool {
let leftValue = lhs.pointee
lhs.pointee = lhs.pointee + 1
return !(leftValue != rhs)
}
var b = 1
var a = withUnsafeMutablePointer(to: &b) { $0 }
print(a == 1 && a == 2 && a == 3)
复制代码
思路二:利用ExpressibleByIntegerLiteral, Equatable两个协议
ExpressibleByIntegerLiteral:可以让一个自定义的类通过字面量进行初始化
Equatable: 可以让自定义的类通过==进行比较
通过这两个协议,可以让a==1
这个比较,进入到实现Equatable协议的方法中,然后在这个方法里进行逻辑处理,代码如下
class Number : ExpressibleByIntegerLiteral, Equatable {
var value: Int
required init(integerLiteral value: Int) {
self.value = value
}
static func == (lhs: Number, rhs: Number) -> Bool {
let leftValue = lhs.value
lhs.value += 1
return leftValue == rhs.value
}
}
let a = Number(integerLiteral: 1)
print(a == 1 && a == 2 && a == 3)
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END