【问题标题】:Swift 4: Non-nominal type 'T' does not support explicit initialization when converting Objective-c to SwiftSwift 4:将 Objective-c 转换为 Swift 时,非标称类型“T”不支持显式初始化
【发布时间】:2018-05-29 06:00:07
【问题描述】:

我正在尝试将 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 时,当我尝试声明一个类型为 PrintBlock 的变量时,我收到了一个 'Non-nominal type 'PrintBlock' (aka '(Optional<HLPrinter>) -> ()') does not support explicit initialization' 错误:

let pb = PrintBlock()

我不熟悉 Objective-C,那么我应该如何将带有 _printerBlock 的函数转换为 Swift?

【问题讨论】:

  • 您正在使用不允许执行的 PrintBlock() 初始化 PrintBlock

标签: objective-c swift typedef type-alias


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您不能初始化闭包,根据您的要求,您可以像 objc 中的属性一样简单地创建变量

    typealias Listener = (HLPrinter) -> ()
    
    var lister:Listener?
    

    在某些事件中

     self.lister?(value) 
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多