在swift中在运行时注入具体类型

时间:2018-02-14 06:32:14

标签: 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的实现吗?

1 个答案:

答案 0 :(得分:0)

我做过类似的事情,但没有使用框架本身。想象一下,你有一个应用程序,你想要另一个应用程序,其中包括第一个应用程序的所有代码加上对该代码功能的一些“调整”。并且您希望最小化第一个(基础)应用程序代码库中必须更改的内容。 (即我不想继承子类,因为很快就会以许多不可取的方式重构基本代码。)

我实际上已经成功写了&在另一个iOS应用程序中运行了几个iOS应用程序(其中每个应用程序只是一组调整代码加上底层应用程序的代码。基本应用程序的代码只需调用一些在基本应用程序中无效的额外方法 - 符合的方法一个特定的协议。基础应用程序没有重大变化,但它的代码库被主要方式调整和扩展,另一个应用程序(实际上是几个)也在该代码库中编译。

通过使用协议扩展和where子句来定位实现协议的特定具体类,您可以通过添加额外的代码文件来实现对一组基本代码(例如,第一个应用程序)的目标“调整” (第二)应用程序。它可以是一种非常强大的方法来扩展代码库的基本功能,而无需重新构建或重新安排基本代码。

因此,尝试让框架A和B都使用“where”子句扩展您的Namable协议以定位框架C的具体类。框架C也应该具有相同的扩展,只需使用空的无操作方法。因此,框架A或B基本上可以为Framework C的空协议方法提供一个可插件实现,其方式是Framework C对A和B一无所知。您基本上可以针对特定类的特定方法方式,仅仅通过链接的其他代码(带有where子句的扩展协议)的存在替换其内容。

这是关于斯威夫特,恕我直言的最神奇的事情之一。