说我有一些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
类型,有什么方法可以使其工作?
答案 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界面。