Consider a public class that conforms to an internal protocol that has an 
initializer requirement:

internal class SomeInternalClass { }

internal protocol SomeInternalProtocol {
  init(parameter: SomeInternalClass)
}

public class SomePublicClass: SomeInternalProtocol {
  // compiler error: initializer requirement ‘init(parameter:)’ can only be 
satisfied by a `required` initializer in non-final class ‘SomePublicClass’
  init(parameter: SomeInternalClass) { }
}

To resolve this error, init(parameter:) must be made public required, or 
SomePublicClass must be made final.

If init(parameter:) were made public required, it would expose the module's 
internal structure; SomeInternalClass would need to be made public also. This 
makes sense, of course; if SomePublicClass is public and non-final, it may be 
subclassed outside the module and any subclass would need to know about 
init(parameter:) in order to remain conformant to SomeInternalProtocol.

Alternatively, If SomePublicClass were made final, it could not be subclassed 
outside the module and thus, SomeInternalClass would not need to be exposed, 
but subclassing SomePublicClass within the module would also be impossible also.

I propose that it should be possible to mark a class as publicly final while 
remaining internally non-final. This would resolve both issues: 
SomeInternalClass can remain internal, and SomePublicClass can be subclassed 
within the module.
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to