在Swift中,如何让a == 1 && a == 2 && a == 3等于true

最近在网上看到一道比较有意思的面试题,在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
喜欢就支持一下吧
点赞0 分享