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...好吧,如果有人有幸进入那个兔子洞,请告诉我!
在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...好吧,如果有人有幸进入那个兔子洞,请告诉我!