3

我使用的颱風迅速的項目,據我瞭解我要所有注射明確地映射在TyphoonAssembly這樣的:自動注射颱風+迅速

public dynamic func appDelegate() -> AnyObject { 
    return TyphoonDefinition.withClass(AppDelegate.self) { 
     (definition) in 

     definition.injectProperty("cityDao", with:self.coreComponents.cityDao()) 
     definition.injectProperty("rootViewController", with:self.rootViewController()) 
    } 
} 

這似乎很難管理,並且非常脆弱(重構時)。

我看到有自動注射(通過類型匹配)支持位置: https://github.com/appsquickly/Typhoon/wiki/Auto-injection-(Objective-C) 但這是objetive℃。

有沒有人知道一種方式,我可以連接注射而不顯式註冊與他們的名字作爲字符串的道具?

謝謝!

回答

1

(Typhoon creator here)。

Typhoon是一個動態的,內省的依賴注入容器,它使用Objective-C運行時。有以下限制,當談到斯威夫特:

  • 用Objective-C的避免了神奇的字符串,允許使用普通的IDE重構工具,但是在斯威夫特選擇魔術字符串。
  • Objective-C運行時只提供屬性的類型信息,而不是方法或初始化參數。所以只有屬性可以支持任何類型的自動佈線(宏,隱式等)。
  • Swift沒有註釋或宏系統,但它確實有第一類函數。

您可以使用以下指示颱風自動線在斯威夫特的屬性:

public dynamic func appDelegate() -> AnyObject { 
    return TyphoonDefinition.withClass(AppDelegate.self) { 
     (definition) in 

     definition.injectProperty("cityDao") 
     definition.injectProperty("rootViewController") 
    } 
} 

。 。這將按類型匹配,就像自動接線Objective-C宏一樣。但是,這並不能避免指定要注入的屬性的名稱。 在Swift中沒有其他方法可以做到這一點。 :(

它值得使用時颱風與雨燕提的還有一些其它限制:

  • 「純」雨燕類 - 不是延伸的可可基類或聲明@objc指令 - 不支持內省,動態調度和動態方法調用。颱風僅適用於可可類。
  • 斯威夫特協議需要@objc指令。
+0

@talarari非常歡迎。對不起,壞消息的傳播者,但希望通過颱風,語言演化或另一個「功能性」數字資源庫,隨着時間的推移,斯威夫特迪的方法會有所改進。對於後者來說,FiercyCrucible看起來像是一個夢幻般的開始。 – 2015-04-06 10:44:44

+0

感謝您的深入回覆! 我會看看FieryCrucible,看看它是否更適合我的需求。 關於屬性名稱,我不能使用反射方法獲取一個類的所有屬性,並註冊他們與颱風? 正如這裏提到的: [鏈接] http://freecake.yayuhh.com/simple-reflection-in-swift/ 我仍然需要註冊類,但這可以節省魔術字符串的一部分。 我對ios開發相當陌生,所以我可能會在這裏。 – talarari 2015-04-06 10:47:39

+0

@talarari我們*可*提供'按照慣例'的財產注入方式。反射方法實際上沒有幫助,因爲它所能做的只是枚舉屬性,這對於工具支持很有用。但要實際執行注入,需要運行時方法調用。幸運的是,ObjC運行時可以列出Swift類的屬性,如果它們擴展了'NSObject',以及動態調用方法。 。 。所以這歸結爲「按照慣例」的方式。你想開一個問題嗎? – 2015-04-06 10:49:33