繁体   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