2014-09-25 47 views
4

我看到Swift出現了一些奇怪的行爲,或者我做錯了什麼。重寫Swift中的Obj-c類函數

比方說,你有一個名爲TurtleHelper的OBJ-C類,這看起來是這樣的:

@interface TurtleHelper : NSObject 

+(NSDictionary*)getTurtles; 

@end 

然後我想重寫斯威夫特這種方法,所以我這樣做:

class SwiftTurtles: TurtleHelper { 

    override class func getTurtles() -> NSDictionary { 
    ... 
    } 
} 

的編譯器向我拋出以下錯誤:

使用選擇器getTurtles的重寫方法具有不兼容的類型'() - > NSDictio nary'

我在做什麼錯?

+1

的類型可能是的NSDictionary?而不是NSDictionary,因爲原始的Objective-C方法可以返回nil,但是返回NSDictionary的Swift方法不能。 – gnasher729 2014-09-25 11:19:26

+0

不,同樣的錯誤信息。 – henryeverett 2014-09-25 11:22:28

+0

你有沒有嘗試過這樣的東西....重寫func getTurtles() - >(NSDictionary!){....}。如果你知道NSDictionary鍵/值類型,那麼嘗試使用override func getTurtles() - >([NSArray:AnyObject]!){.....}。在這種情況下,我使用字典鍵/值作爲NSArray/AnyObject。 – Suresh 2014-09-25 11:28:16

回答

7

事實證明,答案似乎是

override class func getTurtles() -> [NSObject : AnyObject]! 

從蘋果公司的文檔:

當你從一個NSDictionary對象,以迅捷的字典橋樑,產生的字典式的[NSObject的:AnyObject]。您可以將任何NSDictionary對象連接到Swift字典,因爲所有Objective-C對象都與AnyObject兼容。

參考:https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

+0

同樣適用於覆蓋返回NSArray的方法。 (NSArray *)的Swift等價物將是[AnyObject]。存儲在NSArray中的類型是不相關的。 – 2015-06-05 09:13:53