Расширение общего набора ObjC в Swift 3
Swift 3 поставляется с SE-0057, который, среди прочего, означает, что:
По умолчанию расширения параметризованных классов Objective-C никак не могут ссылаться на параметры типа. Например:
extension MySet {
func someNewMethod(x: T) { ... } // error: cannot use `T`.
}
... где MySet
объявляется в ObjC как @interface MySet<T : id<NSCopying>> : NSObject
.
Все, что ясно (и возможно какое-то обходное решение). Однако следующее не компилируется, несмотря на то, что я не использую никаких параметров типа из класса ObjC, который я пытаюсь расширить. Я использую другой несвязанный класс Swift как возвращаемый параметр для метода расширения:
class Foo { }
struct Bar { }
extension MySet {
func foo() -> Foo { return Foo() } // Both produce: Extension of a generic
func bar() -> Bar { return Bar() } // Objective-C class cannot access the
} // class generic parameters at runtime
Это ошибка? Или я что-то упускаю?
Ответы
Ответ 1
Подробнее
xКод 8.3.1, быстрый 3.1
Пример
MySet.h
#import <Foundation/Foundation.h>
@interface MySet<T : id<NSCopying>> : NSObject
@end
typedef struct ObjCStruct
{
__unsafe_unretained NSString* str;
int num;
} ObjCStruct;
MySet.m
#import "MySet.h"
@implementation MySet
@end
MySetExtension.swift
import Foundation
class Foo: NSObject {
var str = "Foo"
var num = 1
}
extension ObjCStruct {
init() {
num = 2
str = Unmanaged.passRetained("ObjCStruct")
}
}
extension MySet {
func foo() -> Foo { return Foo() }
func bar() -> ObjCStruct { return ObjCStruct() }
}
Bridging-заголовок
#import "MySet.h"
Использование
NSLog(@"%@", [set foo].str);
NSLog(@"%@", [set bar].str);