Skip to content

convention

ShenYj edited this page May 3, 2021 · 1 revision

Swift 关键字: convention

在看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的函数指针的闭包。

Getting Started

Social

Clone this wiki locally