I'm in favor of this pattern.
> On Mar 20, 2017, at 4:40 PM, Jonathan Hull via swift-evolution > <swift-evolution@swift.org> wrote: > > Huge +1 > > >> On Mar 17, 2017, at 9:26 AM, 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 >> >> 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> 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> 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> 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> 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> >>>>>> 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 >>>>> 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 > > _______________________________________________ > 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