2015-04-11 1 views
3

В моей библиотеке Swift EVCloudKitDao Я много делаю с отражением. Из-за этого я установил базовый класс своих объектов данных в NSObject. Теперь после обновления до Xcode 6.3 я получаю сообщение об ошибке для двух функций для получения хэша и описания объекта. Функция описания была приятной, но мне нужен хэш, чтобы мои объекты работали с Set.hash() и описание() не разрешено в Xcode 6.3 для NSObject

Вот код, который я имею

public class EVCloudKitDataObject : NSObject, NSCoding, Printable, Hashable, Equatable { 

    public func hash() -> Int { 
     return self.hashValue 
    } 
    public func description() -> String { 
     return EVReflection.description(self) 
    } 
} 

Ошибки, которые я получаю это:

/Users/evermeer/Desktop/dev/GitHub/EVCloudKitDao/AppMessage/AppMessage/CloudKit/EVCloudKitDataObject.swift:106:17: Method 'hash()' with Objective-C selector 'hash' conflicts with getter for 'hash' from superclass 'NSObject' with the same Objective-C selector

/Users/evermeer/Desktop/dev/GitHub/EVCloudKitDao/AppMessage/AppMessage/CloudKit/EVCloudKitDataObject.swift:86:17: Method 'description()' with Objective-C selector 'description' conflicts with getter for 'description' from superclass 'NSObject' with the same Objective-C selector

Кто-нибудь знает, как я могу решить эту проблему? Вы не можете использовать переопределение.

+0

Что вы подразумеваете под «вы не можете использовать переопределение»? – Antonio

+0

при использовании переопределения вы получаете ошибку: метод не переопределяет какой-либо метод из его суперкласса –

+0

Дубликат [Проблема с соответствием протоколу Objective-C из подкласса Swift NSObject] (http://stackoverflow.com/questions/28718577/issue -with-matching-to-object-c-protocol-from-swift-nsobject-subclass)? –

ответ

10

Как говорится в ошибке, в обоих случаях существует конфликт имен между свойством и методом. Самый очевидный способ исправить это, превратив 2 метода в свойства:

public override var hash: Int { 
    return self.hashValue 
} 

public override var description: String { 
    return EVReflection.description(self) 
} 

, который также может быть записана в виде:

public override var hash:Int { 
    get { 
     return self.hashValue 
    } 
} 
public override var description : String { 
    get { 
     return EVReflection.description(self) 
    } 
} 

Причина, почему она работала в предыдущей версии, скорее всего, из-за это:

Swift now detects discrepancies between overloading and overriding in the Swift type system and the effective behavior seen via the Objective-C runtime.

подробнее в release notes (поиск 18391046 и 18383574)

+0

Странно, что в Xcode 6.2 он работал с ними как с методом. Теперь я изменил его на свойства, как вы сказали, и теперь все работает снова. Благодаря! –

+1

Я думаю, что это из-за ошибок на пару языков - прочитайте обновленный ответ – Antonio