您的位置:首页 > 移动开发 > Swift

swift之给拓展Category增加属性

2016-05-06 09:16 393 查看
使用 Category 扩展现有的类的功能的时候,直接添加实例变量这种行为是不被允许的,这时候一般就使用 property
配合 Associated Object 的方式,将一个对象 “关联” 到已有的要扩展的对象上。进行关联后,在对这个目标对象访问的时候,从外界看来,就似乎是直接在通过属性访问对象的实例变量一样,可以非常方便。

// MyClass.swift

class MyClass {

}

// MyClassExtension.swift

private var key: Void?

extension MyClass {

var title: String? {

get {

return objc_getAssociatedObject(self, &key) as? String

}

set {

objc_setAssociatedObject(self,

&key, newValue,

.OBJC_ASSOCIATION_RETAIN_NONATOMIC)

}

}

}

// 测试

func printTitle(input: MyClass) {

if let title = input.title {

print("Title: \(title)")

} else {

print("没有设置")

}

}

let a = MyClass()

printTitle(a)

a.title = "Swifter.tips"

printTitle(a)

//
输出:

//
没有设置

//
Title: Swifter.tips

key
 的类型在这里声明为了 
Void?
,并且通过 
&
 操作符取地址并作为 
UnsafePointer<Void>
 类型被传入

PS:详情请看http://swifter.tips/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: