Swift 4: неноминальный тип 'T' не поддерживает явную инициализацию при преобразовании Objective-c в Swift - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь преобразовать проект Objective-C в Swift, вот один из файлов .h в Objective-C:

typedef void(^PrintBlock)(HLPrinter *printer);

@interface ShoppingViewController : UIViewController

@property (copy, nonatomic) PrintBlock printBlock;

@end

, а в файле .m есть функция:

HLPrinter *printer = [self getPrinter];

if (_printBlock) {
    _printBlock(printer);
}

И вот как я преобразовал его в Swift:

typealias PrintBlock = (_ printer: HLPrinter?) -> Void

Но когда я попытался преобразовать функцию выше в Swift, я получаю ошибку 'Non-nominal type 'PrintBlock' (aka '(Optional<HLPrinter>) -> ()') does not support explicit initialization', когда япытался объявить переменную с типом PrintBlock:

let pb = PrintBlock()

Я не знаком с Objective-C, так как мне преобразовать эту функцию с _printerBlock в Swift?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

PrintBlock - псевдоним для закрытия.Вы не можете просто создать экземпляр, как класс или структуру.Вам необходимо присвоить замыкание (или функцию) свойству.

Код Swift будет выглядеть следующим образом:

typealias PrintBlock = (_ printer: HLPrinter?) -> Void

class ShoppingViewController: UIViewController {
    var printBlock: PrintBlock?

    func getPrinter() -> HLPrinter {
        return somePrinter
    }

    func someFunction() {
        if let printBlock = printBlock {
            let printer = getPrinter()
            printBlock(printer)
        }
    }
}

Код вызова будет выглядеть примерно так:

let vc = ShoppingViewController()
vc.printBlock = { (printer) in
    // do something with printer
}

Или, если у вас есть функция:

func someFunction(_ printer: HLPrinter) {
}

Вы можете назначить следующее:

vc.printBlock = someFunction

Здесь есть несколько предположений, основанных на частичной информации, предоставленной вами в вашем вопросе.

0 голосов
/ 29 мая 2018

Вы не можете инициализировать Closure, для вас требуется просто создать переменную, как свойство в objc

typealias Listener = (HLPrinter) -> ()

var lister:Listener?

И для какого-то события

 self.lister?(value) 

Надеюсь, что это полезно

...