Bu harika bir soru ve Chris Lattner kasıtlı olarak bu özelliği desteklemek istemese de, ben de birçok geliştirici gibi, bunun önemsiz bir görev olduğu diğer dillerden gelen hislerimi bırakamıyorum. Pek çok unsafeBitCast
örnek var, çoğu resmin tamamını göstermiyor, işte daha ayrıntılı bir örnek :
typealias SwfBlock = () -> ()
typealias ObjBlock = @convention(block) () -> ()
func testSwfBlock(a: SwfBlock, _ b: SwfBlock) -> String {
let objA = unsafeBitCast(a as ObjBlock, AnyObject.self)
let objB = unsafeBitCast(b as ObjBlock, AnyObject.self)
return "a is ObjBlock: \(a is ObjBlock), b is ObjBlock: \(b is ObjBlock), objA === objB: \(objA === objB)"
}
func testObjBlock(a: ObjBlock, _ b: ObjBlock) -> String {
let objA = unsafeBitCast(a, AnyObject.self)
let objB = unsafeBitCast(b, AnyObject.self)
return "a is ObjBlock: \(a is ObjBlock), b is ObjBlock: \(b is ObjBlock), objA === objB: \(objA === objB)"
}
func testAnyBlock(a: Any?, _ b: Any?) -> String {
if !(a is ObjBlock) || !(b is ObjBlock) {
return "a nor b are ObjBlock, they are not equal"
}
let objA = unsafeBitCast(a as! ObjBlock, AnyObject.self)
let objB = unsafeBitCast(b as! ObjBlock, AnyObject.self)
return "a is ObjBlock: \(a is ObjBlock), b is ObjBlock: \(b is ObjBlock), objA === objB: \(objA === objB)"
}
class Foo
{
lazy var swfBlock: ObjBlock = self.swf
func swf() { print("swf") }
@objc func obj() { print("obj") }
}
let swfBlock: SwfBlock = { print("swf") }
let objBlock: ObjBlock = { print("obj") }
let foo: Foo = Foo()
print(testSwfBlock(swfBlock, swfBlock))
print(testSwfBlock(objBlock, objBlock))
print(testObjBlock(swfBlock, swfBlock))
print(testObjBlock(objBlock, objBlock))
print(testAnyBlock(swfBlock, swfBlock))
print(testAnyBlock(objBlock, objBlock))
print(testObjBlock(foo.swf, foo.swf))
print(testSwfBlock(foo.obj, foo.obj))
print(testAnyBlock(foo.swf, foo.swf))
print(testAnyBlock(foo.swfBlock, foo.swfBlock))
İlginç olan, SwfBlock'u ObjBlock'a ne kadar hızlı bir şekilde attığıdır, ancak gerçekte iki SwfBlock bloğu her zaman farklı değerler olurken, ObjBlocks olmayacaktır. ObjBlock'u SwfBlock'a attığımızda, onlara da aynı şey oluyor, iki farklı değer haline geliyorlar. Bu nedenle referansı korumak için bu tür dökümlerden kaçınılmalıdır.
Hala tüm konuyu anlıyorum, ancak dilediğim bir şey @convention(block)
sınıf / yapı yöntemlerinde kullanma yeteneği , bu yüzden oylama gerektiren veya bunun neden kötü bir fikir olduğunu açıklayan bir özellik talebinde bulundum . Ayrıca bu yaklaşımın hep birlikte kötü olabileceğine dair bir his var, eğer öyleyse, kimse nedenini açıklayabilir mi?
MyClass.self
)