Ini adalah pertanyaan yang bagus dan sementara Chris Lattner dengan sengaja tidak ingin mendukung fitur ini, saya, seperti banyak pengembang, juga tidak dapat melepaskan perasaan saya yang berasal dari bahasa lain di mana ini adalah tugas yang sepele. Ada banyak unsafeBitCast
contoh, kebanyakan tidak menunjukkan gambaran lengkap, berikut ini lebih detailnya :
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))
Bagian yang menarik adalah betapa cepatnya melemparkan SwfBlock ke ObjBlock, namun pada kenyataannya dua blok SwfBlock yang dicor akan selalu memiliki nilai yang berbeda, sementara ObjBlocks tidak. Saat kami mentransmisikan ObjBlock ke SwfBlock, hal yang sama terjadi pada mereka, keduanya menjadi dua nilai yang berbeda. Jadi, untuk mempertahankan referensi, pengecoran semacam ini harus dihindari.
Saya masih memahami keseluruhan subjek ini, tetapi satu hal yang saya inginkan adalah kemampuan untuk menggunakan @convention(block)
metode kelas / struct, jadi saya mengajukan permintaan fitur yang memerlukan pemungutan suara atau menjelaskan mengapa itu ide yang buruk. Saya juga merasa pendekatan ini mungkin buruk secara keseluruhan, jika demikian, adakah yang bisa menjelaskan mengapa?
MyClass.self
)