[swift-evolution] Nongeneric classes that inherit from generic classes not visible from objc

Charlie Monroe charlie at charliemonroe.net
Wed Dec 14 10:47:48 CST 2016


Hi Davide,

AFAIK this is not (easily) possible (please, correct me someone if I'm wrong) since Swift's generics aren't "lightweight" as ObjC generics are.

In ObjC, no matter what you use for the generics, you still have just 1 class that handles all call:

@interface MyClass<T> : NSObject
@end

@class A, B;

NSLog(@"%@", NSStringFromClass([MyClass<A *> self])); // MyClass
NSLog(@"%@", NSStringFromClass([MyClass<B *> self])); // MyClass

[MyClass<A *> self] == [MyClass<B *> self]; // YES

In Swift, when you compile the generic class, a class is generated for each type you use - example:

class MyClass<T> {}
class A {}
class B {}

NSStringFromClass(MyClass<A>.self) // _TtGC14__lldb_expr_417MyClassCS_1A_
NSStringFromClass(MyClass<B>.self) // _TtGC14__lldb_expr_417MyClassCS_1B_

MyClass<A>.self == MyClass<B>.self // false

This makes what you suggest very complicated.

> On Dec 14, 2016, at 2:47 PM, Davide Mendolia via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Hi,
> 
> Maybe this has been asked before but I couldn't find it.
> 
> I would like to be able to give visibility of non-generic subclass of a generic class to obj-c. Is there any limitation of the compiler knowing that the type of the non-generic type is closed, to generate a compatible version for obj-c?
> 
> Code Example:
> 
> class SwiftSuperType<T: NSObjectProtocol> : NSObject {
> 
> }
> 
> class NonGenericClass2: SwiftSuperType<NSObject> {
> 
> 
> }
> 
> Or with a obj-c super class:
> 
> @interface ObjcSuperType<T: id<NSObject>> : NSObject
> 
> @end
> 
> 
> class NonGenericClass: ObjcSuperType<NSObject> {
> 
> }
> 
> 
> 
> 
> Actual Behaviour:
> 
> Non-generic classes are not visible in obj-c. If adding the @objc notation we get the following error.
> 
> Actual error message:
> 
> Generic subclasses of '@objc' classes cannot have an explicit '@objc' attribute because they are not directly visible from Objective-C
> 
> regards,
> 
> --
> Davide Mendolia
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161214/e95910d1/attachment.html>


More information about the swift-evolution mailing list