This is even worse if I want to create a singleton, and ensure that the
only way to access it, is through a static let on the class:

class Singleton: NSObject {
    static let instance = Singleton()
    private override init() {
        super.init()
    }
}

In Swift, I can't instantiate this class, since it has no internal/public
initializers. However, since it inherits from NSObject (which is necessary
to access it from objc), I can initialize it from objc, even though it's
private. Annotating it with @nonobjc doesn't help either.

Is there a reason why Swift doesn't automatically declare accessors from
the super class, that are either private or @nonobjc in the Swift subclass
implementation, as __unavailable?

Is there anyway I can enforce it using some (combination of) attributes?


sv.



2016-06-08 15:12 GMT+02:00 Svein Halvor Halvorsen <svei...@lvor.halvorsen.cc
>:

> Hi,
>
> In Objective-C, I've often attributed initializer from super classes as
> unavailable. Like this;
>
> @class Dependency;
>
> @interface SomeClass : NSObject
>
> - (nullable instancetype)init __unavailable;
>
> - (nonnull instancetype)initWithDependency:(nonnull Dependency
> *)dependency;
>
> @end
>
> This makes the compiler complain if I try to instantiate [[SomeClass alloc]
> init];
>
> However, If I declare a Swift class like this:
>
> class SomeClass: NSObject {
>
>     init(dependency: Dependency) {
>
>         super.init()
>
>     }
>
> }
>
> The generated header file will look like this:
>
>
> @interface SomeClass : NSObject
>
> - (nonnull instancetype)initWithDependency:(Dependency * _Nonnull)dependency
> OBJC_DESIGNATED_INITIALIZER;
>
> @end
>
> If I try to use init, it will be a run time error, and not a compile time
> error.
> It there any way I can make Swift create the desired objc header file?
>
>
> Svein Halvor
>
>
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to