convention - ShenYj/ShenYj.github.io GitHub Wiki
在看RxWebKit
源码的时候看到这样一个关键字convention
/// Reactive wrapper for `func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void)`
public var decidePolicyNavigationAction: ControlEvent<WKNavigationActionPolicyEvent> {
typealias __ActionHandler = @convention(block) (WKNavigationActionPolicy) -> ()
let source:Observable<WKNavigationActionPolicyEvent> = delegate
.methodInvoked(.decidePolicyNavigationAction).map { args in
let view = try castOrThrow(WKWebView.self, args[0])
let action = try castOrThrow(WKNavigationAction.self, args[1])
var closureObject: AnyObject? = nil
var mutableArgs = args
mutableArgs.withUnsafeMutableBufferPointer { ptr in
closureObject = ptr[2] as AnyObject
}
let __actionBlockPtr = UnsafeRawPointer(Unmanaged<AnyObject>.passUnretained(closureObject as AnyObject).toOpaque())
let handler = unsafeBitCast(__actionBlockPtr, to: __ActionHandler.self)
return (view, action, handler)
}
return ControlEvent(events: source)
}
于是搜索了下作用
当需要将一个函数作为参数传入另一个函数时, 用来修饰这个函数参数 在iOS上能作为一个函数参数的类型有:
c的函数指针
oc的block
swift的闭包(closures)
convention: 将此属性应用于函数的类型以指示其调用约定
@convention(swift) : 表明这个是一个swift的闭包
@convention(block) :表明这个是一个兼容oc的block的闭包
@convention(c) : 表明这个是兼容c的函数指针的闭包。