2016-04-09 1 views
2

Я мигрируют некоторые селекторы Swift 2.2, но у меня проблема с одним из них:Xcode 7.3, Swift 2.2: по умолчанию селектор инициализатора (новая проверка времени компиляции)

Init string selector

Код:

let hook = ARTRealtimePresenceQuery.testSuite_injectIntoClassMethod("init") { // Default initialiser 
    presenceQueryWasCreated = true 
} 

Теперь Xcode хотят, чтобы помочь мне делать переход, но в неправильном направлении:

enter image description here

Код:

let hook = ARTRealtimePresenceQuery.testSuite_injectIntoClassMethod(#selector(_NSEnumeratorType.init)) { // Default initialiser 
    presenceQueryWasCreated = true 
} 

Я пытаюсь это исправить:

enter image description here

Код:

let hook = ARTRealtimePresenceQuery.testSuite_injectIntoClassMethod(#selector(ARTRealtimePresenceQuery.init)) { // Default initialiser 
    presenceQueryWasCreated = true 
} 

Итак, мой Questio n: Как я могу выбрать метод инициализации по умолчанию с новым синтаксисом #selector?

(Он работал в Swift 2.0.)

Текущая ошибка:

"Неоднозначное использование 'Init()'"

UPDATE 1:

ARTRealtimePresenceQuery Инициализаторы:

- (instancetype)init; 
- (instancetype)initWithClientId:(nullable NSString *)clientId connectionId:(nullable NSString *)connectionId; 
- (instancetype)initWithLimit:(NSUInteger)limit clientId:(nullable NSString *)clientId connectionId:(nullable NSString *)connectionId; 
+0

Я не знаком с этой структуры, что делает 'testSuite_injectIntoClassMethod' делать, и инициализации метод которого вы хотите сослаться? - Обратите внимание, что 'Selector (" init ")' остается в силе! –

+0

@MartinR «testSuite_injectIntoClassMethod» добавляет блок кода после текущего 'селектора' для определенного класса. В этом случае я хочу добавить блок кода в инициализатор по умолчанию 'ARTRealtimePresenceQuery'. Могу ли я использовать 'Selector (« init »)' без предупреждения? Думаю, нет. – ricardopereira

+1

Можете ли вы попробовать '#selector (ARTRealtimePresenceQuery.init as() -> ARTRealtimePresenceQuery)'?Он должен компилироваться без предупреждения, но не знаю, работает ли он по назначению. –

ответ

2

Как показано в

со ссылкой на вариант нет параметра в качестве одного из нескольких перегруженных методов требует явного as <signature> бросок. Этот метод может быть применен к инициализации методов, а также:

class MyClass : NSObject { 

    override init() { } 

    init(s : String) { } 
} 

// Selector referring to init(): 
let sel1 = #selector(MyClass.init as() -> MyClass) 

// Selector referring to init(s : String): 
let sel2 = #selector(MyClass.init as (String) -> MyClass) 

Так что в вашем случае это будет

#selector(ARTRealtimePresenceQuery.init as() -> ARTRealtimePresenceQuery) 
Смежные вопросы