Расширение общего набора 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);