使用Objective-C工厂方法在Swift中创建对象会产生编译器错误

use*_*748 3 compiler-errors objective-c orsserialport swift

我正在尝试使用ORSSerialportObjective-C串行库启动串行连接.我已经成功使用它来查找所有串口但是在打开连接时遇到问题.

文档显示了端口的打开方式:

ORSSerialPort *serialPort = [ORSSerialPort serialPortWithPath:@"/dev/cu.KeySerial1"];
Run Code Online (Sandbox Code Playgroud)

我写了以下内容:

let serialPort: ORSSerialPort.serialPortWithPath(serialListPullDown.selectedItem)
Run Code Online (Sandbox Code Playgroud)

但是,Xcode不会自动完成我的方法,也不会编译.给我错误"serialPortWithPath不是ORSSerialport的成员类型".我已经正确设置了桥接头,我已经在同一个库中使用了另一个类,语法类似,没有任何问题.这里发生了什么?

Mar*_*n R 6

简答:用.创建对象

let serialPort = ORSSerialPort(path:"/dev/cu.KeySerial1")
Run Code Online (Sandbox Code Playgroud)

详细信息: Objective-C工厂方法

+ (ORSSerialPort *)serialPortWithPath:(NSString *)devicePath;
Run Code Online (Sandbox Code Playgroud)

映射到Swift as

init!(path devicePath: String!) -> ORSSerialPort
Run Code Online (Sandbox Code Playgroud)

这在"与Objective-C API交互"中有记录(感谢Nate Cook!):

为了一致性和简单性,Objective-C工厂方法在Swift中被映射为便捷初始化器.此映射允许它们使用与初始化程序相同的简洁,清晰的语法.

这意味着工厂方法映射到 Objective-C init方法相同的Swift方法

- (id)initWithPath:(NSString *)devicePath;
Run Code Online (Sandbox Code Playgroud)

两者都将从Swift调用

let serialPort = ORSSerialPort(path:"/dev/cu.KeySerial1")
Run Code Online (Sandbox Code Playgroud)

事实证明这会调用init方法.因此,无法从Swift调用工厂方法.

  • 哦,它在[文档](https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/interactingwithobjective-capis.html)中:"为了一致性和简单性,Objective-C工厂方法获得映射为Swift中的便捷初始化器.这种映射允许它们使用与初始化器相同的简洁,清晰的语法." 你知道的越多* (2认同)