Как заставить универсальный Objective-C работать со Swift - PullRequest
0 голосов
/ 12 декабря 2018

Пытался воспроизвести универсальный Objective-C и внедрил очередь.

#import <Foundation/Foundation.h>

@interface Queue<T> : NSObject

@property (readonly, copy, nonatomic) T _Nullable front;
@property (readonly, copy, nonatomic) T _Nullable back;

- (_Nullable T) dequeue;
- (Queue * _Nonnull) enqueue:(T)item;
- (BOOL) isEmpty;

@end

и создать экземпляр очереди в Swift

let queue: Queue<String> = Queue()

получил ошибку Queue 'требуетсячто 'String' будет типом класса , так как String является структурой в swift.

Я был бы признателен за любое предложение о том, чтобы сделать универсальный Objective C для Swift.

1 Ответ

0 голосов
/ 12 декабря 2018

Самый простой способ - использовать и разыграть String на NSString.Я имею в виду, используйте let queue: Queue<NSString> = Queue() вместо.Для использования прокси-класса, подобного этому:

class Container {
var value: String = ""
}

T должен быть только NSObject.Для привязки Swift-ObjC только мосты типа class могут использоваться.Просто скройте ваше значение в другом классе класса (Container).

Другой случай - использование протокола ObjC вместо T

@protocol SomeProtocol <NSObject>
- (void)someMessage;
@end

@interface Queue: NSObject

@property (readonly, copy, nonatomic) SomeProtocol _Nullable front;
@property (readonly, copy, nonatomic) SomeProtocol _Nullable back;

- (_Nullable SomeProtocol) dequeue;
- (Queue * _Nonnull) enqueue:(SomeProtocol)item;
- (BOOL) isEmpty;

@end

в коде Swift вы можете использовать let someProtocolObject: SomeProtocol?

...