2014-09-04 104 views
12

是否可以擴展所有現有的Swift對象,如同在ObjectiveC中將NSObject添加到category之上一樣?擴展所有Swift對象

根據此article,所有Swift對象都繼承自SwiftObject類,但我無法向其添加擴展名。

有沒有解決這個問題的方法?

+3

SwiftObject業務可能是一個實現細節,但不從另一個類繼承的Swift類是默認的根類。 – Atomix 2014-09-04 11:23:16

回答

11

不是。Swift對象實際上並沒有從任何根基類繼承。編譯器可以插入一個作爲實現細節,但語言沒有這個。

該解決方案是一個函數,通常是泛型函數,而不是方法。適用於「各種對象」的東西並不是真正的封裝。有很少的行爲適用於宇宙中的每一個可以想象的事物。但是函數絕對可以映射任何東西,所以這裏是一個更好的工具。


正如注意,不是所有對象NSObject繼承或者,這是不是一種語言的要求。但你絕對是絕大多數人所做的。看一下NSProxy樹頂部的非NSObject樹(它實現NSObject協議,但不從NSObject類繼承)。這就是爲什麼idNSObject*不一樣的原因。


您關於相關對象的問題,這是內置:

import Foundation 

class Thing { } 

let thing = Thing() 

var MyKey: Character = "0" 

objc_setAssociatedObject(thing, &MyKey, "I'm a value!", objc_AssociationPolicy(OBJC_ASSOCIATION_COPY)) 

println(objc_getAssociatedObject(thing, &MyKey)) 

這就是你設法創造?請注意,objc_setAssociatedObject也是一個函數,而不是ObjC中的一個方法。

+0

我打算做的是實現類似ObjectiveC的associated_object。任何想法如何使用泛型函數做到這一點? – cfischer 2014-09-04 14:26:37

+0

你可以在Swift中使用關聯的對象。你爲什麼要重新創建它? (用一個例子編輯回答)或者你的意思是別的嗎? – 2014-09-04 15:08:24

+0

@RobNapier:有時候人們定義一個類別來使用關聯對象,以便能夠通過普通的方法API使用它們,而不必使用運行時的函數。 – newacct 2014-09-04 18:44:16