工程: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
解决如下图:
坑三:
swift:无论你是执行按钮响应方法还是执行点击手势方法都提示:unrecognised selector sent to instance
解决:
响应事件是否为私有的?如果是进行接下来操作:
方法一:去掉private
方法一: @objc private func tapAction() 私有函数前加@objc
开始混编:
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)
}
}
调用闭包:
就先写到这里吧,希望对大家有所帮助,有问题希望不吝赐教,谢谢!