2015-09-04 3 views
0

Вот тип блока, который я определяю в Objective-CОбъектив-C Блок в Swift - переменная отсутствует?

typedef void (^arrayBlock)(NSArray *blockArray); 

У меня есть Objective-C класс с методом, который использует это как блок обратного

-(void)loadTimesWithSuccessBlock:(arrayBlock)successBlock; 

Когда я пытаюсь использовать этот метод в Свифте, это то, что дает автозаполнение.

let timeClockLibrarian = HMFTimeClockLibrarian() 
timeClockLibrarian.loadTimesWithSuccessBlock { ([AnyObject]!) -> Void in 
    //Where is blockArray?   
} 

Я предполагаю, что [AnyObject]! должен быть NSArray. Но я не понимаю, как я должен получить доступ к этой переменной?

Если бы я использовать этот метод в Objective-C Я получаю результат:

[timeClockLibrarian loadTimesWithSuccessBlock:^(NSArray *blockArray) { 
     //I can use the blockArray here :) 
}]; 

ответ

1

[AnyObject]! действительно только тип переменной; автозаполнение не назовешь его. Вам просто нужно сделать что-то вроде (blockArray: [AnyObject]!).

let timeClockLibrarian = HMFTimeClockLibrarian() 
timeClockLibrarian.loadTimesWithSuccessBlock { (blockArray: [AnyObject]!) -> Void in 
    // your code here 
} 
+0

Это то, что я думал. Когда я пытаюсь назначить blockArray локальной переменной, то есть {var logEntries = [LogEntry()}, используя {self.logEntries = blockArray}, он сообщает мне: «Невозможно вызвать« loadTimesWithSuccessBlock »с помощью списка аргументов типа» (([AnyObject]!) -> Void) '" – Hackmodford

+0

Это потому, что массив нетипизирован и присваивание не выполняется. У вас разные варианты в зависимости от того, используете ли вы Xcode 6 или бета-версию Xcode 7. – zneak

+0

Я использую Xcode 6 – Hackmodford

0

Написать так:

let timeClockLibrarian = HMFTimeClockLibrarian() 
timeClockLibrarian.loadTimesWithSuccessBlock { blockArray in 
    doSomething(blockArray) 
} 

Если вы хотите сослаться на слабое использование само это:

let timeClockLibrarian = HMFTimeClockLibrarian() 
timeClockLibrarian.loadTimesWithSuccessBlock { [weak self] blockArray in 
    self?.doSomething(blockArray) 
} 

Вы также можете избавиться от неявного разворачивания. Если это так, укажите значение nullability в коде Obj-C:

typedef void (^arrayBlock)(nullable NSArray *blockArray); 
Смежные вопросы