2015-02-23 1 views
11

Я хочу реализовать что-то вроде «registerClassForAction». Для этой цели я определил протокол:Swift: создать класс (AnyClass), соответствующий протоколу

@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 и иметь возможность отключить ее в определенный момент времени.

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

Рон

+1

«Определить функцию для регистрации объекта в другой класс "является делегацией. Я бы предположил, что ваш вызывающий объект создает свойство делегирования TestProt и назначает ему TestClass. Литейная гимнастика отличает в лучшем случае. –

+0

Вы правы - я был «вдохновлен» методом 'registerClass: forCellWithReuseIdentifier:' UITableViewController. Но я также хотел бы контролировать жизненный цикл этого класса, поскольку он нужен только в очень конкретное время, и его можно было бы отпустить. Не уверен, что делегирование является правильным выбором. Просто из любопытства я узнаю о том, как создавать события и протоколы Swift, поэтому это кажется хорошим упражнением. – Ron

ответ

2

Это возможно в 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() 

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^