Класс 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) }
}
Другие вопросы по тегам