Swift 5、比较两个闭包指针的方法是什么?

In Swift 5, what is a way to compare pointers to two closures?

在Swift5中,比较指向两个闭包的指针的方法是什么?

有人告诉我这里 In Swift 3, what is a way to compare two closures?

这是一个不同的问题。 所以现在你有了它。

public typealias Action = () -> Void

let action1: Action = {}
let action2: Action = {}

assert(action1 == action1)
assert(action1 != action2)

关于指针:值得注意的是,对象(classes)是引用类型,因此两个对象的相等性与两个对象的同一性不同。对于相等性(如果在 class 中定义),您有 == 运算符,对于身份,=== 运算符:

class Foo:Equatable {
    var i:Int = 0
    static func == (lhs: Foo, rhs: Foo) -> Bool {
        return lhs.i == rhs.i
    }
}

let foo1 = Foo()
let foo2 = Foo()
let referenceToFoo1 = foo1

foo1 == foo2 // equality: true, since foo1.i == foo2.i, which is the criteria for equality
foo1 === foo2 // identity: false, since they are two different instances
foo1 === referenceToFoo1 // identity: true, both variables point to the same instance
foo1.i = 2
print(referenceToFoo1.i) // 2, since it refers to the same object

“引用”也可以称为“指针”,尽管在 Swift 中,与在 C 中不同,我们不必深入研究指针算法,这是一种很好的 low-level 方式处理指向对象和其他数据的指针的内存地址。


就像classes一样,闭包在Swift中也是引用类型,所以除了它们的“相等”(它们是否包含相同的代码和捕获的信息等)我们还可以查看它们的身份(即这两个变量是指同一个闭包还是两个不同的闭包,即使它们看起来相同等)。

问题是,Swift 似乎真的不想帮助我们。

就像 == 对闭包不起作用一样,=== 也一样。 closure-types 似乎也不符合任何协议(请注意,没有单一的“闭包类型”,而是取决于参数和 return 类型的无限数量)。

此外,即使将闭包强制转换为 AnyObject 也不起作用:

foo1 as AnyObject === referenceToFoo1 as AnyObject // true, as expected

// with the `action1` closure from the question:
action1 as AnyObject === action1 as AnyObject // false; a bit of a surprise

看起来每次 Swift 对 AnyObject 进行闭包时,它都会出于某种原因创建一个新的 AnyObject 实例......所以比较这些也没有发现任何东西。

所以……我认为我们无法推断 Swift 中闭包的同一性或相等性。也许还有其他方法,可能是通过 unsafe pointers...好吧,如果有人有幸进入那个兔子洞,请告诉我!