Ответ должен использовать NS_SWIFT_BRIDGED_TYPEDEF
В качестве заголовка вопроса:
Как мне соединить objc typedef NSString со Swift as String?
Я нашел NS_SWIFT_BRIDGED_TYPEDEF
, используйте это для определения типа ObjC NSString, тогда тип будет соединен как String to 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
Добавьте NS_SWIFT_BRIDGED_TYPEDEF
для типа ObdeCdef:
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)
ИтакЯ достиг своей цели:
Но я действительно хочу использовать тип ObjcNSString в Swift
Если вы посмотрите на разницу между интерфейсами Swift с помощью илибез NS_SWIFT_BRIDGED_TYPEDEF
вы увидите, добавив NS_SWIFT_BRIDGED_TYPEDEF
, мы получим более желаемый интерфейс Swift.