视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Object-C 和 Swift 混编 你要的都在这里
2025-10-03 14:31:48 责编:小OO
文档
Object-C 和 Swift 混编 你要的都在这里

  工程:Object-C 穿插Swift

  那些坑:

  坑一:

  使用场景:Swift代码中使用OC代理

  报错:type 'xxxx' does not conform to protocol 'xxxxDelegate'

  解决:先查看OC代理是否是@require或者也没写@optional

  如果是: 在Swift中实现你的必须要实现代理方法否则就会报错,仍然错检查代理方法是否写的正确

  坑二:

  导入第三方静态库:

  dyld: can't resolve symbol __TMaC6PexKit11Participant in xxx/测试框架_swift.app/测试框架_swift because dependent dylib #1 could not be loaded

  解决如下图:

  坑二解决办法

  开始混编:

  1.新建Swift文件

  下一步:

  这个时候就会生成三个文件一个新建的文件一个是Swift和OC之间的桥接文件:项目名称-Bridging-Header.h还有一个是隐藏文件:项目名称-Swift.h 负责将Swift转成OC

  2.配置工程 TARGETS-->Building Settings -->搜pack --> 修改Defines Module 为YES

  3.Swift和OC互调

  1> OC调用Swift

  在OC文件中导入头文件:#import "项目名称-Swift.h" 这个头文件就是那个隐藏文件,然后用法就同OC用法一致

  OC 调用Swift的delegate和Block

  2> Swift调用OC

  需要调用的OC文件首先需要导入头文件,但不是像OC一样直接导入到当前文件,需要导入到OC和Swift桥接文件中:项目名称-Bridging-Header.h

  Swift调用OC的delegate和Block

  点击白色区域看是否走了Block和delegate方法

  4.Swift和Swift互调

  这里不像Swift调用OC需要先把OC的头文件导入:项目名称-Bridging-Header.h,但是需要提前声明

  delegate和Block用法

  SwiftTestView代码贴出来:(定义Block)

import UIKit

@objc(SwiftTestDelegate)

protocol SwiftTestDelegate : NSObjectProtocol {

    func didReciveResult(result:NSInteger)

}

class SwiftTestView: UIView {

    weak var delegate:SwiftTestDelegate?

    override init(frame: CGRect) {

        super.init(frame:frame)

        backgroundColor = UIColor.blueColor()

        self.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: "doIt"))

    }

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

    func doIt() {

        delegate?.didReciveResult(1)

    }

}

  Swift的代理方法:

  Swift的闭包使用:

  SwiftTestView代码贴出来:

import UIKit

// 代理

@objc(SwiftTestDelegate)

protocol SwiftTestDelegate : NSObjectProtocol {

    func didReciveResult(result:NSInteger)

}

// 闭包(Block)

typealias TestViewBlock = () -> ()

typealias TestViewBlock1 = (Int,Int) -> String

typealias TestViewBlock2 = (Int,Int) -> Void

class SwiftTestView: UIView {

    weak var delegate:SwiftTestDelegate?

    var testViewBlock:TestViewBlock!

    var testViewBlock1:TestViewBlock1!

    var testViewBlock2:TestViewBlock2!

    override init(frame: CGRect) {

        super.init(frame:frame)

        backgroundColor = UIColor.blueColor()

        self.addGestureRecognizer(UITapGestureRecognizer.init(target: self, action: "doIt"))

    }

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

    func doIt() {

        delegate?.didReciveResult(1)

        if testViewBlock != nil {

            testViewBlock()

        }

        if testViewBlock1 != nil {

            testViewBlock1(7,8)

        }

        if testViewBlock2 != nil {

            testViewBlock2(1,2)

        }

    }

    func testViewBlockWithParam(testViewBlock2:TestViewBlock2) {

        testViewBlock2(3,4)

    }

}

  调用闭包:下载本文

显示全文
专题