I am really glad to see this up again. It is definitely something that I am 
quite certain that all of the Foundation team and contriubters are quite 
enthusiastic about.

I know it would likely mean some extra work for the compiler team but factory 
initializers would be quite impactful not only for correctness for implementing 
swift-corelibs-foundation, performance for a number of cases as well as safety 
(I am certain we could remove some gnarly hacks in both the Foundation overlay 
and swift-corelibs-foundation if we could utilize factory pattern initializers)

> On Mar 17, 2017, at 4:26 PM, Riley Testut via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Hi again everyone!
> 
> Now that Swift 4 Stage 2 proposals are being considered, I thought it might 
> be time to revisit this proposal and see if it might align with the goals set 
> forth for Swift 4.
> 
> As a quick tl;dr, this proposal describes a new "factory initializer" that 
> would allow you to return a value from an initializer. This would have 
> several benefits, as mentioned in the proposal itself as well as throughout 
> this mailing list. For convenience, here's a link to the proposal on GitHub: 
> https://github.com/rileytestut/swift-evolution/blob/master/proposals/NNNN-factory-initializers.md
>  
> <https://github.com/rileytestut/swift-evolution/blob/master/proposals/NNNN-factory-initializers.md>
> 
> Would love to hear any more comments on this proposal, and if we feel this is 
> appropriate for considering for Swift 4 I'll happily re-open the pull request!
> 
> Riley Testut
> 
> On Nov 19, 2016, at 7:45 AM, arkadi daniyelian <ark...@icloud.com 
> <mailto:ark...@icloud.com>> wrote:
> 
>> i would appreciate this feature.
>> 
>> For unexperienced developers, its often hard to recognize *when* factory is 
>> a good fit to do the job, and how exactly approach the implementation. I 
>> imagine having this feature built into the language may help to choose and 
>> implement factory when its the right thing to do.
>> 
>>> On Nov 18, 2016, at 12:23 AM, Charles Srstka via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> Is there any chance of reviving this? It seems to me that since this would 
>>> require Swift initializers to be implemented internally in such a way that 
>>> they can return a value (as Objective-C init methods do), it may affect ABI 
>>> stability and thus may be germane to the current stage of Swift 4 
>>> development.
>>> 
>>> Charles
>>> 
>>>> On Dec 17, 2015, at 3:41 PM, Riley Testut via swift-evolution 
>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>> 
>>>> Recently, I proposed the idea of adding the ability to implement the 
>>>> "class cluster" pattern from Cocoa (Touch) in Swift. However, as we 
>>>> discussed it and came up with different approaches, it evolved into a 
>>>> functionality that I believe is far more beneficial to Swift, and 
>>>> subsequently should be the focus of its own proposal. So here is the 
>>>> improved (pre-)proposal:
>>>> 
>>>> # Factory Initializers
>>>> 
>>>> The "factory" pattern is common in many languages, including Objective-C. 
>>>> Essentially, instead of initializing a type directly, a method is called 
>>>> that returns an instance of the appropriate type determined by the input 
>>>> parameters. Functionally this works well, but ultimately it forces the 
>>>> client of the API to remember to call the factory method instead, rather 
>>>> than the type's initializer. This might seem like a minor gripe, but given 
>>>> that we want Swift to be as approachable as possible to new developers, I 
>>>> think we can do better in this regard.
>>>> 
>>>> Rather than have a separate factory method, I propose we build the factory 
>>>> pattern right into Swift, by way of specialized “factory initializers”. 
>>>> The exact syntax was proposed by Philippe Hausler from the previous 
>>>> thread, and I think it is an excellent solution:
>>>> 
>>>> class AbstractBase {
>>>>  public factory init(type: InformationToSwitchOn) {
>>>>      return ConcreteImplementation(type)
>>>>  }
>>>> }
>>>> 
>>>> class ConcreteImplementation : AbstractBase {
>>>> 
>>>> }
>>>> 
>>>> Why exactly would this be useful in practice? In my own development, I’ve 
>>>> come across a few places where this would especially be relevant:
>>>> 
>>>> ## Class Cluster/Abstract Classes
>>>> This was the reasoning behind the original proposal, and I still think it 
>>>> would be a very valid use case. The public superclass would declare all 
>>>> the public methods, and could delegate off the specific implementations to 
>>>> the private subclasses. Alternatively, this method could be used as an 
>>>> easy way to handle backwards-compatibility: rather than litter the code 
>>>> with branches depending on the OS version, simply return the 
>>>> OS-appropriate subclass from the factory initializer. Very useful.
>>>> 
>>>> ## Protocol Initializers
>>>> Proposed by Brent Royal-Gordon, we could use factory initializers with 
>>>> protocol extensions to return the appropriate instance conforming to a 
>>>> protocol for the given needs. Similar to the class cluster/abstract class 
>>>> method, but can work with structs too. This would be closer to the factory 
>>>> method pattern, since you don’t need to know exactly what type is 
>>>> returned, just the protocol it conforms to.
>>>> 
>>>> ## Initializing Storyboard-backed View Controller
>>>> This is more specific to Apple Frameworks, but having factory initializers 
>>>> could definitely help here. Currently, view controllers associated with a 
>>>> storyboard must be initialized from the client through a factory method on 
>>>> the storyboard instance (storyboard. 
>>>> instantiateViewControllerWithIdentifier()). This works when the entire 
>>>> flow of the app is storyboard based, but when a single storyboard is used 
>>>> to configure a one-off view controller, having to initialize through the 
>>>> storyboard is essentially use of private implementation details; it 
>>>> shouldn’t matter whether the VC was designed in code or storyboards, 
>>>> ultimately a single initializer should “do the right thing” (just as it 
>>>> does when using XIBs directly). A factory initializer for a View 
>>>> Controller subclass could handle the loading of the storyboard and 
>>>> returning the appropriate view controller.
>>>> 
>>>> Here are some comments from the previous thread that I believe are still 
>>>> relevant:
>>>> 
>>>> 
>>>>> On Dec 9, 2015, at 1:06 PM, Philippe Hausler <phaus...@apple.com 
>>>>> <mailto:phaus...@apple.com>> wrote:
>>>>> 
>>>>> I can definitely attest that in implementing Foundation we could have 
>>>>> much more idiomatic swift and much more similar behavior to the way 
>>>>> Foundation on Darwin actually works if we had factory initializers.
>>>> 
>>>> 
>>>>> On Dec 7, 2015, at 5:24 PM, Brent Royal-Gordon <br...@architechies.com 
>>>>> <mailto:br...@architechies.com>> wrote:
>>>>> 
>>>>> A `protocol init` in a protocol extension creates an initializer which is 
>>>>> *not* applied to types conforming to the protocol. Instead, it is 
>>>>> actually an initializer on the protocol itself. `self` is the protocol 
>>>>> metatype, not an instance of anything. The provided implementation should 
>>>>> `return` an instance conforming to (and implicitly casted to) the 
>>>>> protocol. Just like any other initializer, a `protocol init` can be 
>>>>> failable or throwing.
>>>>> 
>>>>> Unlike other initializers, Swift usually won’t be able to tell at compile 
>>>>> time which concrete type will be returned by a protocol init(), reducing 
>>>>> opportunities to statically bind methods and perform other optimization 
>>>>> tricks. Frankly, though, that’s just the cost of doing business. If you 
>>>>> want to select a type dynamically, you’re going to lose the ability to 
>>>>> aggressively optimize calls to the resulting instance.
>>>> 
>>>> 
>>>> I’d love to hear everyone’s thoughts on this!
>>>> 
>>>> Best,
>>>> Riley Testut
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to