iOS组件化(二) - iOS本地组件化管理

3,990 阅读1分钟


一、创建主项目和组件

  1. 创建主项目,并添加CocoaPods

WX20210726-142254@2x.png

  1. 创建组件模块,File - New - Project - Framework,下一步,填写组件名,选择Swift语言,下一步,Add to、Group选择主项目,完成。

image.png

image.png

  1. 模块中新建一个类MyBase.swift用于测试

image.png

  1. Command + B 编译组件项目,生成BaseModule.framework

image.png

二、使用模块的方法

手动添加到主项目,或通过CocoaPods添加到主项目,选其一

手动添加模块到主项目
  1. 模块中要向外暴露的接口文件,移动到Build Phases - Headers - Public下(Swift项目文件不用添加)。

image.png

  1. 进入主项目,Targets -Build Phases - Link Binary With Libraries,添加BaseModule.framework

WX20210726-151609@2x.png

  1. 主项目,Targets - Build Setting - Search Paths - User Header Search paths添加${SRCROOT}

WX20210726-151742@2x.png

CocoaPods添加到主项目
platform :ios, '10.0'
use_frameworks!

workspace 'TestComponentDemo.xcworkspace'

# BaseModule组件
target 'BaseModule' do
  # 配置组件路径
  project 'BaseModule/BaseModule.xcodeproj'
end

# 主项目
target 'TestComponentDemo' do

end

三、测试使用

//
//  ViewController.swift
//  TestComponentDemo
//
//  Created by yuanzhiying on 2021/7/26.
//

import UIKit
import BaseModule

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        test()
        testExtend()
    }

    func test() {
        let base = MyBase()
        base.openName = "modify open name"
        base.publicName = "modify public name"

        print(base.openName ?? "")
        print(base.publicName ?? "")

        base.openHelloWorld()
        base.publicHelloWorld()
        base.objcPublicHelloWorld()
    }

    func testExtend() {
        let myExtend = MyClass()

        print(myExtend.openIntro)
        print(myExtend.publicIntro)

        myExtend.openHelloWorld()
    }
}

class MyClass: MyBase {
    // 存储属性不能被override
//    override var openName: String?
//    override var publicName: String?

    override var openIntro: String {
        return "openIntro"
    }

    // Overriding non-open property outside of its defining module
//    override var publicIntro: String? {
//        return "publicIntro"
//    }

    override func openHelloWorld() {
    }

    // Overriding non-open instance method outside of its defining module
//    override func publicHelloWorld() {}

    // Overriding non-open instance method outside of its defining module
//    override func objcPublicHelloWorld() {}
}