Подтвердить что ты не робот

Swift: создать класс (AnyClass), соответствующий протоколу

Я хочу реализовать что-то вроде "registerClassForAction". Для этой цели я определил протокол:

@objc protocol TestProt {
    func testMe() -> String
}

Сделайте объявление класса:

class TestClass: NSObject, TestProt {
    func testMe() -> String {
        return "test"
    }
}

Я определяю функцию для регистрации объекта в другом классе:

func registerClassForAction(aClass: AnyClass) { ... }

Переключение на REPL, я бы смоделировал метод регистрации:

let aClass: AnyClass = TestClass.classForCoder() //or .self
let tClass = aClass as NSObject.Type
let tInst = tClass() as TestProt
tInst.testMe()

В настоящее время это работает, но есть ли другой способ создать экземпляр tClass, кроме

let tClass = aClass as NSObject.Type

Причина для запроса, я хотел бы изучить возможность избавиться от NSObject, чтобы мой TestClass не наследовал от NSObject. Было рассмотрено делегирование, но я хотел бы контролировать время жизни tInst и иметь возможность отключить его в определенный момент времени.

спасибо за помощь

Рон

4b9b3361

Ответ 1

Это возможно в Swift 2.0 без необходимости @objc или подкласса NSObject:

protocol TestProt {
    func testMe() -> String
}

class TestClass: TestProt {

    // This init is required in order
    // to construct an instance with
    // a metatype value (class.init())
    required init() {
    }

    func testMe() -> String {
        return "Hello from TestClass"
    }
}

let theClass = TestClass.self
let tInst: TestProt = theClass.init()

tInst.testMe()

введите описание изображения здесь