最近无意间看到一个有趣的帖子:
var a = ???;
if(a == 1 && a == 12){
console.log(a);
}
这是一个JS社区抛出来的问题。第一眼看到这个问题的时候,感觉这似乎是一个无稽之谈,一个变量怎么可能会同时满足俩个条件呢!
不过后来深入思考一下,发现这类问题有点意思...
如果你也觉得不可能的话,一起随着文章看下去。你也会觉得有点意思~
上面是原文,原文还提供了JS和Java的解决方案,手痒,试着用Swift实现了一下
既然涉及了==, 所以方案基本都是重写==运算符,
- 直接重写Int的==,让1,2,3都相等
extension Int {
static func == (lhs: Int, rhs: Int) -> Bool {
if (1...3).contains(lhs), (1...3).contains(rhs){ return true }
return false
}
}
var a = 1
if a == 1, a == 2, a == 3{
print("true")
} else {
print("failure")
}
-
struct
封装, 封装后涉及了一个问题:struct == Int 能否成立等式, 故采用了ExpressibleByIntegerLiteral,添加了一个struct的便利方法;==方法中,lhs和rhs都是let,无法改变,所以只能也采用contain的方式了
struct SA: Equatable, ExpressibleByIntegerLiteral {
var a : Int
init(integerLiteral value: IntegerLiteralType) {
a = value
}
static func == (lhs: SA, rhs: SA) -> Bool {
if (1...3).contains(lhs.a), (1...3).contains(rhs.a){return true}
return false
}
}
var a: SA = 1
if a == 1, a == 2, a == 3{
print("true")
} else {
print("failure")
}
-
class
封装,class就好用多了,因为class的属性可以被动态改变,所以在==操作时,动态给属性+1,达到同时满足判断;
class A: Equatable, ExpressibleByIntegerLiteral {
var a : Int
required init(integerLiteral value: IntegerLiteralType) {
a = value
}
static func == (lhs: A, rhs: A) -> Bool {
defer { lhs.a += 1 } //++1
let eq = lhs.a == rhs.a
return eq
}
}
三种方法肯定不止,也算不上好,看个乐子了;
其他的
- 比如class中.a 肯定是使用了.a的get方法,可在get方法里面做文章;
- 通过
Runtime
hook==
方法; - 或者直接把==改掉,咱不比较数值了,也能解决问题;
- ...
网友评论