Swift 4:将Objective-c转换为Swift时,非标称类型'T'不支持显式初始化

时间:2018-05-29 06:00:07

标签: objective-c swift typedef type-alias

我正在尝试将Objective-C项目转换为Swift,这是Objective-C中的.h文件之一:

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 :(得分:2)

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

根据您在问题中提供的部分信息,这里有一些假设。

答案 1 :(得分:0)

你不能初始化Closure,对于你的要求你可以简单地创建变量就像objc中的属性一样

typealias Listener = (HLPrinter) -> ()

var lister:Listener?

在某些事件上

 self.lister?(value) 

希望它有用