2017-03-13 37 views
3

我有這段代碼:斯威夫特動態類型調試/發佈

class NotificationsController: NSObject { 

    static var classNotifier: AnyClass { 
     if #available(iOS 10, *) { 
      return UNUserNotificationCenter.classForCoder() 
     } else { 
      return UILocalNotification.classForCoder() 
     } 
    } 

    static func foo() { 
     NotificationsController.classNotifier.foo() 
    } 

} 

其中:

protocol Notificable: class { 
    static func foo() 
} 

extension UNUserNotificationCenter: Notificable { 

    static func foo() { 
     // do something 
    } 

} 

extension UILocalNotification: Notificable { 

    static func foo() { 
     // do something 
    } 

} 

大廈在調試模式下正常工作。
當我構建發佈模式(用於歸檔)時,編譯器說AnyClass沒有一個名爲「foo」的函數。

現在,我知道如果我刪除發佈優化構建工程,但我認爲將是錯誤的解決方案。

其他解決方案?

+0

'classNotifier'返回'Class',但'foo'是一個實例方法,對嗎?另外,我可能會調用你的協議'Notifiable'。 – Edgar

+0

你嘗試過'(NotificationsController.classNotifier as AnyObject).foo()'? –

+0

您是否試圖在協議中使foo通過static來靜態func foo? – Suen

回答

0

過了一段時間我會調查代碼並重寫你的解決方案。問題與protocol Notificable和實例功能func foo()有關。

您嘗試將此函數作爲類函數調用而不是實例1,並且存在問題。

工作解決方案的示例。

protocol Notificable: class { 
    static func foo() 
} 

extension UNUserNotificationCenter: Notificable { 
    internal static func foo() { 

    } 
} 

extension UILocalNotification: Notificable { 
    internal static func foo() { 

    } 
} 

class NotificationsController: NSObject { 

    static var classNotifier: AnyClass { 
     if #available(iOS 10, *) { 
      return UNUserNotificationCenter.classForCoder() 
     } else { 
      return UILocalNotification.classForCoder() 
     } 
    } 

    static func foo() { 
     classNotifier.foo() 
    } 

} 
+0

感謝oleg的觀點。其實是我的錯誤,在真實的代碼中,我已經有了靜態方法(我更新了問題)。問題仍然存在 –

+0

@LucaDavanzo NotificationsController和Extensions在不同的文件中? –

+0

實際上是... –