2015-09-04 158 views
13

比方說,我定義斯威夫特一個泛型類,類似以下內容:在Objective-C使用泛型雨燕類

class MyArray<T> { 
    func addObject(object: T) { 
     // do something... hopefully 
    } 
} 

(我知道有一個稍微更好地落實陣列,這是僅僅是一個例子)

在斯威夫特我現在可以使用這個類很容易:

let a = MyArray<String>() 
a.addObject("abc") 

With Xcode 7, we now have generics in Objective-C,所以我會認爲我合作ULD使用這個類在Objective-C:

MyArray<NSString*> *a = [[MyArray<NSString*> alloc] init]; 
[a addObject:@"abc"]; 

然而,MYARRAY從未添加到我的Project-Swift.h文件。即使我將其更改爲從NSObject繼承,它仍然不會出現在我的Swift.h文件中。

有什麼辦法來創建一個通用斯威夫特類,然後在Objective-C使用它呢?


更新:如果我嘗試從NSObject的繼承與@objc註釋:

@objc(MyArray) 
class MyArray<T>: NSObject { 
    func addObject(object: T) { 
     // do something... hopefully 
    } 
} 

我得到以下編譯器錯誤:

Generic subclasses of '@objc' classes cannot have an explicit '@objc' attribute because they are not directly visible from Objective-C.

這是否意味着有沒有辦法在Objective-C中使用通用的Swift類?

如何之一直接參考類?

+0

你用@objc註釋了你的類嗎? –

+0

@MrBeardsley我只是試過了,它給了一個有趣的編譯器錯誤(見上文)。 – Senseful

回答

17

無法在Objective-C中使用Swift泛型。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID136

This excludes Swift-only features such as those listed here:

  • Generics
  • ...
+0

是否爲Xcode 7更新了該文檔?由於Objective-C中現在有泛型,它不會被認爲是Swift-only特性嗎? – Senseful

+1

@Senseful:Objective-C中的輕量級泛型與Swift泛型不同,也比Swift泛型更受限制。 – newacct

+0

@newacct你知道一個描述限制的網頁嗎? – finneycanhelp

0

有一些情況下解決方法,當你需要導入斯威夫特泛型類成Objective-C的。

比方說,您有使用泛型的Swift REST服務。我使用Moya框架,這就是我的服務看起來像:

class AuthService: BaseService<AuthAPI> { 
    func register(email: String) { 
     // ... 
    } 
} 

這是一個從基礎服務使用泛型繼承,所以我不能在我的Objective-C代碼直接使用它。

所以這裏是一個解決辦法:

讓我們創建AuthServiceProtocol

@objc protocol AuthServiceProtocol { 
    func register(email: String) 
} 

然後讓我們創建服務織物(或單方法,沒有區別):

@objc class Services: NSObject { 
    static let authService: AuthServiceProtocol = AuthService() 
} 

然後我可以從Objective-C代碼中調用我的通用Swift驗證服務:

- (void)someObjcMethod { 
    [Services.authService registerWithEmail:self.email]; 
} 
+0

我成功地在我的obj-c類中調用服務但是,當我嘗試使用authService時會出現錯誤。 「在'Services'類型的對象上找不到'Property'authService'。請幫我解決這個問題 –