如何将objc typedef NSString桥接到Swift作为String?

时间:2018-11-09 03:32:07

标签: swift

说我有一些objc代码:

typedef NSString * ObjcNSString;

@interface ObjC : NSObject
+ (void)doThingsWithString:(nullable ObjcNSString)mid;
@end

上面的objc代码相应生成的Swift接口是:

public typealias ObjcNSString = NSString

open class ObjC : NSObject {
    open class func doThings(with mid: String?)
}

如果我在Swift中使用代码,则会导致问题:

let str: ObjcNSString? = nil
ObjC.doThings(with: str) // Cannot convert value of type 'ObjcNSString?' (aka 'Optional<NSString>') to expected argument type 'String?'

但是我真的很想在Swift中使用ObjcNSString类型,有什么方法可以使其工作?

2 个答案:

答案 0 :(得分:1)

看起来生成的代码不是您想要的。

您得到的错误是您的函数期望使用 Volume | Buyer ------------------------------- 100 | 0 100 | A 200 | 0 200 | 0 类型,但是您正在尝试使用String类型。

要解决此问题,只需将函数声明更改为:

ObjcNSString

但是请记住,您只能在Swift中使用NSString。您不需要输入别名。您也可以像这样编写函数:

open class func doThings(with mid: ObjcNSString?)

答案 1 :(得分:1)

答案是使用NS_SWIFT_BRIDGED_TYPEDEF

作为问题的标题:

  

如何将objc typedef NSString桥接为Swift作为String?

我发现NS_SWIFT_BRIDGED_TYPEDEF,将其用于NSString的ObjC typedef,然后该类型将作为String桥接到Swift。

示例

没有NS_SWIFT_BRIDGED_TYPEDEF

typedef NSString * ObjcNSString;

@interface ObjC : NSObject
+ (void)doThingsWithString:(nullable ObjcNSString)mid;
@end

相应的Swift接口为:

public typealias ObjcNSString = NSString

open class ObjC : NSObject {

    open class func doThings(with mid: String?)
}

这会给我错误:

let str: ObjcNSString? = nil
ObjC.doThings(with: str) // Cannot convert value of type 'ObjcNSString?' (aka 'Optional<NSString>') to expected argument type 'String?'

使用NS_SWIFT_BRIDGED_TYPEDEF

为ObjC typedef添加NS_SWIFT_BRIDGED_TYPEDEF

typedef NSString * ObjcNSString NS_SWIFT_BRIDGED_TYPEDEF;

@interface ObjC : NSObject
+ (void)doThingsWithString:(nullable ObjcNSString)mid;
@end

然后Swift界面变为:

public typealias ObjcNSString = String

open class ObjC : NSObject {

    open class func doThings(with mid: ObjcNSString?)
}

相同的代码可以编译:

let str: ObjcNSString? = nil
ObjC.doThings(with: str)

所以我实现了我的目标:

  

但是我真的很想在Swift中使用ObjcNSString类型


如果您仔细观察带有或不带有NS_SWIFT_BRIDGED_TYPEDEF的Swift界面之间的区别,您会发现通过添加NS_SWIFT_BRIDGED_TYPEDEF我们会得到更理想的Swift界面。