在Swift中通过不同的方案在项目中实现不同的应用

在某些项目中,它们可能具有相同的骨骼,但使用不同的皮肤。 要构建这类应用。 我们可以使用这种方式来实现它们。

我们无需在实现中使用预处理器宏

仅使用扩展名就可以取代预处理器宏。 根据情况,它可以帮助我们的代码比以前更干净。

新建一个项目

1.创建具有单个视图的应用程序
只需创建一个您想要创建的项目即可。 对于本教程,我仅使用单一视图。 实际上我们可以创建任何类型的项目

2.与现有目标重复的目标
请记住修改我们刚刚复制的目标名称,否则该名称将带有后缀的副本

3.创建新计划
必须检查可执行文件是否遵循我们刚刚复制的目标,否则该方案将使用错误的目标

4.重命名捆绑包标识符和产品名称
修改捆绑包标识符,使我们可以通过代码库分发应用程序

5.单独的Info.plist
如果我们要进行其他设置,可以复制中继Info.plist,并根据需要进行设置

6.通过类型1实施

创建协议

  // SchemeProtocol.swiftimport Foundationprotocol SchemeProtocol { 
var schemeTitle:字符串{get}

func displayMonster()
}

实现分支文件。 它从主干扩展了类,并遵循了我们刚刚创建的协议

  // ViewController + SchemeA.swiftimport UIKitextension ViewController:SchemeProtocol { 
var schemeTitle:字符串{
返回“方案A”
} func displayMonster(){
让imageView = UIImageView(框架:CGRect(x:100,y:100,宽度:200,高度:200))
imageView.image = imageLiteral(resourceName:“ SPROUT”)
view.addSubview(imageView)
}
} // ViewController + SchemeB.swiftimport UIKitextension ViewController:SchemeProtocol {
var schemeTitle:字符串{
返回“方案B”
} func displayMonster(){
让imageView = UIImageView(框架:CGRect(x:100,y:100,宽度:200,高度:200))
imageView.image = imageLiteral(resourceName:“ CO2”)
view.addSubview(imageView)
}
}

调用我们刚刚在扩展中实现的函数

  // ViewController.swiftimport UIKitclass ViewController:UIViewController {@IBOutlet私有弱变量公式方案:UILabel! 
@IBOutlet私有弱变量resultmacro:UILabel! 覆盖func viewDidLoad(){
super.viewDidLoad()
标题= schemeTitle
}覆盖f​​unc viewWillAppear(_动画:布尔){
super.viewWillAppear(动画)
displayMonster()
}
}

7.通过类型2实施

创建协议

  // SchemeProtocol.swiftimport Foundationprotocol FormulaSchemeProtocol { 
var结果:整数? {得到}
func caculate(first:Int,second:Int)-> Int
}

使中继文件中的类符合协议
(这是从扩展名开始的一个技巧。因为您的类已经符合该协议。因此您可以在干线中实现部分协议,而其余的可以在分支中实现)

  // Formula.swiftimport Foundationstruct公式:FormulaSchemeProtocol { 
var结果:整数? = 3
}

在分支机构中实施其余协议

  // Formula + SchemeA.swiftimport Foundationextension Formula { 
func caculate(first:Int,second:Int)-> Int {
返回第一+第二
}
} // Formula + SchemeB.swiftimport Foundationextension公式{
func caculate(first:Int,second:Int)-> Int {
返回第一*第二
}
}

显示公式的属性

  // ViewController.swiftimport UIKitclass ViewController:UIViewController { 
@IBOutlet私有弱变量公式:UILabel!
@IBOutlet私有弱变量resultmacro:UILabel! 覆盖func viewDidLoad(){
super.viewDidLoad()标题= schemeTitle
}覆盖f​​unc viewWillAppear(_动画:布尔){
super.viewWillAppear(动画)
FormulaScheme.text = String(Formula()。caculate(first:2,second:4))
}
}

7.通过类型3实施

定义其他Swift标志

创建文件并在Macro中实现

  // MacroFormula.swiftimport Foundationstruct MacroFormula { 
var结果:字符串{
#if SCHEMEAFLAG
返回“宏-A”
#elseif SCHEMEBFLAG
返回“宏-B”
#其他
返回“宏-C”
#万一
}
}

显示来自MacroFormula的属性

  // ViewController.swiftimport UIKitclass ViewController:UIViewController { 
@IBOutlet私有弱变量公式:UILabel!
@IBOutlet私有弱变量resultmacro:UILabel!override func viewDidLoad(){
super.viewDidLoad()title = schemeTitle
}覆写func viewWillAppear(_动画:Bool){
super.viewWillAppear(动画)
resultmacro.text = MacroFormula()。result
}
}

对于结果,我实际上将它们放在了一个项目中(请参阅我在GitHub中放置的以下演示)
我将这些类型分开以清楚地描述它们。
这是结果。

在演示资源库中,有三种类型的实现来显示内容。
1.传统宏(目录中
2。 Trunk符合协议,但是通过扩展实现,放在分支文件中Formula目录中
3.分支文件符合协议,并通过扩展名实现ViewControllers目录中

没有最佳的实现方法,只是选择解决问题的正确方法。

示范资料库:https://github.com/bcbod2002/SeperatedScheme