এটি একটি দুর্দান্ত প্রশ্ন এবং ক্রিস ল্যাটনার যখন ইচ্ছাকৃতভাবে এই বৈশিষ্ট্যটি সমর্থন করতে চান না তখন আমি অনেক বিকাশকারীদের মতো অন্যান্য ভাষা থেকেও আমার অনুভূতিগুলি ছেড়ে দিতে পারি না যেখানে এটি একটি তুচ্ছ কাজ। এখানে প্রচুর unsafeBitCast
উদাহরণ রয়েছে, তাদের বেশিরভাগই পুরো ছবিটি দেখায় না, এখানে আরও বিশদ বিবরণ রয়েছে :
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))
মজার অংশটি হ'ল কীভাবে সুইফ্ট অবাধে সুইফব্লককে ওজব্লক-এ কাস্ট করে, তবুও বাস্তবে দুটি কাস্ট করা সুইফব্লক ব্লক সর্বদা ভিন্ন মান হতে পারে, তবে ওবজব্লকগুলি তা করে না। যখন আমরা সুইজব্লককে ওবজব্লক কাস্ট করি তখন তাদের সাথে একই জিনিস ঘটে, তারা দুটি পৃথক মান হয়ে যায়। সুতরাং, রেফারেন্স সংরক্ষণ করার জন্য, এই ধরণের castালাই এড়ানো উচিত।
আমি এখনও এই পুরো বিষয়টি বুঝতে পেরেছি, তবে একটি জিনিস যা আমি ইচ্ছা করে রেখেছিলাম তা হল @convention(block)
শ্রেণি / কাঠামো পদ্ধতিতে ব্যবহারের দক্ষতা , তাই আমি একটি বৈশিষ্ট্য অনুরোধ দায়ের করেছি যাতে আপ-ভোটিং প্রয়োজন বা এটি কেন খারাপ ধারণা তা ব্যাখ্যা করার জন্য request আমি একটি ধারণাও পেয়েছি যে এই পদ্ধতিটি সমস্ত একসাথে খারাপ হতে পারে, যদি তাই হয় তবে কেন কেউ ব্যাখ্যা করতে পারেন?
MyClass.self