Класс NSObject соответствует протоколу, содержащемуся в NSArray с Swift
Я хотел бы создать метод в Swift, который возвращает массив объектов NSObject, которые соответствуют протоколу. Я пробовал что-то вроде этого:
func createManagers() -> [Manager] {
let result = NSMutableArray(capacity: self.classes.count)
(self.classes as NSArray).enumerateObjectsUsingBlock { (object: AnyObject!, idx: Int, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
// TODO: do something and fill the result array
}
return result as NSArray as! [Manager]
}
Manager
это протокол, как вы видите. Я получаю сообщение об ошибке, что приведение в операторе возврата всегда будет неудачным.
Я хочу сказать компилятору, что у меня есть массив объектов типа NSObject, и все элементы соответствуют протоколу Manager.
2 ответа
Не пытайтесь писать Objective-C на Swift. Уехать от NSObject
, NSArray
а также NSMutableArray
,
Вот ваш код без каких-либо типов Objective-C:
func createManagers() -> [Manager] {
let result = [Manager]()
for (index, aClass) in classes.enumerate() {
// TODO: do something and fill the result array
}
return result
}
Если вы хотите, чтобы ваши возвращаемые типы были подклассом NSObject
:
func createManagers<T: NSObject where T: Manager>() -> [T] {
var result = [T]()
for (index, aClass) in classes.enumerate() {
// TODO: do something and fill the result array
}
return result
}
Ваш возвращаемый тип - это словарь с ключом NSObject и типом значения Manager, а не массивом. Измените тип возврата на [Manager]
, Также вы, вероятно, хотите использовать map
функция массива:
func createManagers() -> [Manager] {
return classes.map { doSomethingAndTransformIntoManager($0) }
}