簡體   English   中英

在運行時迅速注入具體類型

[英]inject concrete type at runtime in swift

在運行時是否有可能注入具體類型。 例如,假設您有兩個框架,它們的方法相同,但實現方式不同:

FrameworkA
func name() -> String {
  return "A"
}

FrameworkB
func name() -> String {
  return "B"
}

所以你在FrameworkC中創建一個協議

FrameworkC
protocol Namable {
  func name() -> String
}

class SomeOtherClass {
    // uses Namable
}

然后,在使用FrameworkC的實際應用中,是否可以僅嵌入或鏈接FrameworkA,然后使用FrameworkA的實現? 同樣,FrameworkC的其他使用者也可以使用FrameworkB的實現?

我做了類似的事情,但是沒有使用框架本身。 假設您有一個應用程序,而您想要另一個應用程序,它包含第一個應用程序的所有代碼以及對該代碼功能的一些“調整”。 並且您希望最小化第一個(基本)應用程序的代碼庫中需要更改的內容。 (即,我不想子類化,因為那樣會很快以許多不希望的方式重構基礎代碼。)

實際上,我已經成功地在另一個iOS應用“之上”編寫並交付了多個iOS應用(每個其他應用只是一組調整代碼以及底層應用的代碼。基本應用的代碼只需要調用一些額外的方法即可)基本應用程序-符合特定協議的方法基本應用程序沒有重大變化,但是它的代碼庫由另一個也在同一代碼庫中編譯的應用程序(實際上是幾個)進行了重大調整和擴展。

通過使用協議擴展和where子句以實現該協議的特定具體類為目標,您只需將額外的代碼文件添加到第二個基本代碼集(例如,第一個應用程序)即可實現目標代碼“調整” )應用。 擴展代碼庫的基本功能可能是一種非常強大的方法,而根本無需重新架構或重新排列基本代碼。

因此,嘗試讓框架A和框架B都使用“ where”子句擴展您的可命名協議,以針對框架C的具體類。框架C應該也應該具有相同的擴展,只是使用空的無操作方法。 因此,框架A或B基本上可以為框架C的空協議方法提供可插入的實現,而框架C對此一無所知。您基本上可以在此針對特定類的特定方法方式,僅以鏈接的其他代碼(帶有where子句的擴展協議)為前提替換其內容。

這是Swift,恕我直言的最神奇的事情之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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