<html><body><div>I think the underlying problem is that you cannot "internally" conform to the internal protocol.<br></div><div><br data-mce-bogus="1"></div><div>Desirable would be something like the following:<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>public class SomePublicClass: internal SomeInternalProtocol { // note internal conformance<br>&nbsp; public convenience init(someOtherParameter: Int) {<br>&nbsp;&nbsp;&nbsp; self.init(parameter: SomeInternalClass())<br>&nbsp; }<br>&nbsp; internal required init(parameter: SomeInternalClass) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do something<br>&nbsp; }<br>}</div><div><br data-mce-bogus="1"></div><div>i.e. when conforming internally the required init would only have to have internal visibility and you could introduce a convenience init for the public API. SomePublicClass would only be usable as SomeInternalProtocol within the module. <br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Actually I think we would have to restrict the protocol to have the same visibility to avoid problems (i.e. it would not be possible to internally conform to a public protocol). This would make the access modifier in the conformance clause redundant, of course, so the proposal would effectively just allow conforming to a protocol with lower visibility, resulting in the conformance to have just that reduced visibility.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>-Thorsten<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div><br>Am 25. April 2016 um 08:27 schrieb Matt Comi via swift-evolution &lt;swift-evolution@swift.org&gt;:<br><br><div><blockquote type="cite"><div class="msg-quote"><div class="_stretch"><span class="body-text-content">Consider a public class that conforms to an internal protocol that has an initializer requirement:<br><br>internal class SomeInternalClass { }<br><br>internal protocol SomeInternalProtocol {<br> init(parameter: SomeInternalClass)<br>}<br><br>public class SomePublicClass: SomeInternalProtocol {<br> // compiler error: initializer requirement ‘init(parameter:)’ can only be satisfied by a `required` initializer in non-final class ‘SomePublicClass’<br> init(parameter: SomeInternalClass) { }<br>}<br><br>To resolve this error, init(parameter:) must be made public required, or SomePublicClass must be made final.<br><br>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.<br><br>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.<br><br>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.<br>_______________________________________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" data-mce-href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" data-mce-href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></span></div></div></blockquote></div></div></body></html>