簡體   English   中英

如何在NotificationCenter中將Struct用作觀察者

[英]How to use Struct as Observer in NotificationCenter

在NotificationCenter Class中,為什么蘋果創建了Any類型的Observer?

func addObserver(Any, selector: Selector, name: NSNotification.Name?, object: Any?)

我的推理。

  1. 如果觀察者是struct,則在將內部分配為函數參數時,它將被復制,然后觀察者將如何接收通知。
  2. 我無法在Struct中編寫任何使用@objc前綴的函數。
  3. 選擇器始終是@objc的類型。

那么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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM