[英]How to use Struct as Observer in NotificationCenter
在NotificationCenter Class中,為什么蘋果創建了Any類型的Observer?
func addObserver(Any, selector: Selector, name: NSNotification.Name?, object: Any?)
我的推理。
那么addObserver中Any的用途是什么。它應該始終是AnyObject類型。
其次,我們已經知道NotificationCenter保留了觀察者的弱副本,並且我們無法對Any類型使用弱修飾符。 那么蘋果如何管理所有這一切?
非常感謝您理解此概念。
沒有人選擇將此參數設置為Any
。 這就是他們默認情況下得到的。 它是從ObjC自動橋接的:
- (void)addObserver:(id)observer
selector:(SEL)aSelector
name:(nullable NSNotificationName)aName
object:(nullable id)anObject;
橋接id
的默認方式是Any
。 它尚未針對Swift進行專門改進。 實際上,您不能在這里真正有意義地使用結構。 編譯器不會阻止您以無用的方式調用它的事實並不意味着它打算以這種方式使用。
為什么輸入Any?
-因為在Objective C中它是id
類型。
為什么不能將函數標記為@obj
@obc
是Swift代碼的關鍵字,它指示什么編譯器應將此方法添加到此Class的頭文件中,是的,您只能為Classes制作頭。
選擇器也是Objective-C術語,它只說要調用哪個函數,類似於msg_send
在NotificationCenter Class中,為什么蘋果創建了Any類型的Observer。
因為所有的 Objective-C id
聲明都被翻譯成Swift as Any。
您可能會反對說這實際上應該是AnyObject,因為這里只有一個類可以工作。 實際上,這就是id
過去被轉換為Swift的方式。 但是如今,您可以傳遞任何需要id
的東西,因為如果它是Objective-C無法理解的,它將被包裝為一個類實例(例如,作為_SwiftValue
),以便可以將其往返於Objective -C然后再次回到Swift。 因此, id
被翻譯為Any。
但是,僅僅因為您可以在此處傳遞結構並不意味着您應該這樣做。 正如您所發現的,它不起作用。 Objective-C無法自檢Swift結構。
在很多情況下,可可都通過傳遞錯誤的東西給您足夠的空間來吊死自己。 CALayer的contents
鍵入為Any,但是如果您傳遞的不是CGImage,則什么都不會發生。 該layerClass
如果一個UIView的類型是AnyClass,但你最好通過一個CALayer的子類。 我可以繼續下去。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.