Add closure to extension within swift in runtime
来源:互联网 发布:微博怎么绑定域名 编辑:程序博客网 时间:2024/05/21 12:08
Add closure to extension within swift
主要是利用objc_setAssociatedObject
将closure添加到实例中去,先看看该方法在Objective-c
和swift
中的声明:
Objective-C
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
swift:
public func objc_setAssociatedObject(object: AnyObject!, _ key: UnsafePointer<Void>, _ value: AnyObject!, _ policy: objc_AssociationPolicy)
主要是参数value
的类型,分别是id
和AnyObject
,在Objective-C
中,系统会自动将Block转化id
类型,正常使用,而在swift
里则会提示形如下面的错误信息:
实例代码:
typealias TestClosureType = ()->()var testClosure: TestClosureTypeobjc_setAssociatedObject(self, "Test Block", testClosure, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
错误信息提示如下:
Cannot convert value of type 'TestClosureType' (aka '()->()') to expected argument type 'AnyObject!'
原因很清晰,类型不符合,只需要将closure转成AnyObject类型即可,借助于:
public func unsafeBitCast<T, U>(x: T, _: U.Type) -> U
可以将 closure转成AnyObject
类型,只是我们还需要修改点东西,修改之后的结果如下:
typealias TestClosureType = @convention(block)()->()var testClosure: TestClosureTypeobjc_setAssociatedObject(self, "Test Block", unsafeBitCast(testClosure, AnyObject.self), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
取出来的时候再转回去,方法如下:
let completionBlock = unsafeBitCast(objc_getAssociatedObject(self, "Test Block"), TestClosureType.self)
使用这个方法,主要是想偷懒,当然定义代理啊通知啊等等都可以解决问题,另当别论。
参考:Cast Closures/Blocks
1 0
- Add closure to extension within swift in runtime
- How to add a runtime in private Cloud Foundry
- Cannot add Controls from 64-bit Assemblies to the Toolbox or Use in Designers Within the Visual Stud
- How to add third party jar in compile time but not runtime
- swift closure
- Swift - Closure
- swift - closure
- How to understand scope in JavaScript closure
- How to add or replace files within MSI file.
- [!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfil
- Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or
- [!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfil
- [!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfil
- How Do I Declare a Closure in Swift?
- swift extension
- Swift Extension
- Email: Add new mail attention extension in Thunderbird
- note : add COM interface To Shell Extension DLL
- 华硕笔记本 FX50J 触控板驱动
- HttpURLConnection与HttpClient的Get与Post请求数据流程
- 4. Spring 4.2.3前瞻-使用@Order调整配置类加载顺序
- Linux 常用命令(随时更新)
- Android ODEX介绍
- Add closure to extension within swift in runtime
- Simple OpenGL Image Library(soil纹理库)
- zoj1003 crashing balloon
- UI第八天:UINavigationController、界⾯通信
- IOS6 自动布局 入门(2)
- java连接mysql与简单操作mysql的增删改查简单例子
- ajax基础(1)
- 1、Button、Label和Textfield的交互
- 如何在接收到空的远程推送消息时,在APP作出响应。