Как мне соединить objc typedef NSString со Swift как String? - PullRequest
0 голосов
/ 09 ноября 2018

Скажите, у меня есть некоторый код objc:

typedef NSString * ObjcNSString;

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

Соответствующий сгенерированный интерфейс Swift для вышеуказанного кода objc:

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?'

Но я действительно хочу использовать тип ObjcNSString в Swift, есть ли способ заставить его работать?

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Ответ должен использовать 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.

0 голосов
/ 12 ноября 2018

Похоже, что сгенерированный код не совсем то, что вы хотите.

Вы получаете сообщение о том, что ваша функция ожидает тип String, но вы пытаетесь использовать тип ObjcNSString.

Чтобы это исправить, просто измените объявление функции на:

open class func doThings(with mid: ObjcNSString?)

Но имейте в виду, вы можете просто использовать NSString в Swift. Вам не нужны typealias. Вы можете написать свою функцию так:

open class func doThings(with mid: NSString?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...