2014-09-25 2 views
4

Либо я вижу странное поведение от Свифта, либо я делаю что-то неправильно.Переопределение функции класса Obj-c в Swift

Допустим, у вас есть Obj-C класс, называемый TurtleHelper, который выглядит следующим образом:

@interface TurtleHelper : NSObject 

+(NSDictionary*)getTurtles; 

@end 

Тогда я хочу, чтобы переопределить этот метод в Swift, поэтому я делаю это:

class SwiftTurtles: TurtleHelper { 

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

компилятор меняет следующую ошибку:

Метод переопределения с селектором getTurtles имеет несовместимый тип '() -> NSDictio nary '

Что я делаю неправильно?

+1

Тип вероятно NSDictionary? а не NSDictionary, потому что исходный метод Objective-C может возвращать нуль, но метод Swift, возвращающий NSDictionary, не может. – gnasher729

+0

Нет, такое же сообщение об ошибке. – henryeverett

+0

Вы попробовали что-то вроде этого .... override func getTurtles() -> (NSDictionary!) {....}. И если вы знаете тип/тип NSDictionary, тогда попробуйте переопределить func getTurtles() -> ([NSArray: AnyObject]!) {.....}. В этом случае я использовал ключ/значение словаря как NSArray/AnyObject. – Suresh

ответ

7

Оказывается, что ответ, кажется,

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

Из документации Apple:

Когда мост от NSDictionary объекта к Swift словарь, полученный словарь типа [NSObject : AnyObject]. Вы можете подключить любой объект NSDictionary к словарю Swift, потому что все объекты Objective-C совместимы с AnyObject.

Ссылка: https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

+0

также относится к переопределению метода, который возвращает NSArray. Быстродействующим эквивалентом (NSArray *) будет [AnyObject]. Типы, хранящиеся в NSArray, не имеют значения. –