Swift 4: 非标称类型 'T' 将 Objective-c 转换为 Swift 时不支持显式初始化
Swift 4: Non-nominal type 'T' does not support explicit initialization when converting Objective-c to Swift
我正在尝试将 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
:[=21= 的变量时出现 'Non-nominal type 'PrintBlock' (aka '(Optional<HLPrinter>) -> ()') does not support explicit initialization'
错误]
let pb = PrintBlock()
我不熟悉Objective-C,所以我应该如何将_printerBlock
的函数转换成Swift?
你不能初始化闭包,对于你的要求,你可以像 属性 in objc
一样简单地创建变量
typealias Listener = (HLPrinter) -> ()
var lister:Listener?
并且在某些事件中
self.lister?(value)
希望对您有所帮助
PrintBlock
是闭包的别名。您不能像 class 或结构那样简单地创建一个实例。您需要为 属性.
分配一个闭包(或函数)
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
根据您在问题中提供的部分信息,这里有一些假设。
我正在尝试将 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
:[=21= 的变量时出现 'Non-nominal type 'PrintBlock' (aka '(Optional<HLPrinter>) -> ()') does not support explicit initialization'
错误]
let pb = PrintBlock()
我不熟悉Objective-C,所以我应该如何将_printerBlock
的函数转换成Swift?
你不能初始化闭包,对于你的要求,你可以像 属性 in objc
一样简单地创建变量typealias Listener = (HLPrinter) -> ()
var lister:Listener?
并且在某些事件中
self.lister?(value)
希望对您有所帮助
PrintBlock
是闭包的别名。您不能像 class 或结构那样简单地创建一个实例。您需要为 属性.
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
根据您在问题中提供的部分信息,这里有一些假设。