Isn’t 1 und 2.1 almost the same stuff? I’ve asked once if there is a chance for 
Swift to support init(_ other: Self) { self = other } for classes. Joe Groff 
replied this is called “factory initializer”.

This feature is highly needed for all the iOS developers out there who abuse 
NIBs and create a custom UIView in a nib file then instead of assigning it to a 
UIViewController they nest it in another container view, which is not what it’s 
meant for in the first place. Factory initializer could solve this issue by 
simply assigning the instance created from a nib file to self. The nested view 
hierarchy would disappear and it won’t be that much of an abuse anymore.



-- 
Adrian Zubarev
Sent with Airmail

Am 8. Juni 2017 um 14:09:30, Gor Gyolchanyan via swift-evolution 
([email protected]) schrieb:

Disclaimer: I do realize that any of the following ideas may have been 
discussed before and/or there might be a good reason for their lack of 
implementation, so please go easy in me. 🙂

1. Arbitrary `self` Assignments In Intializers

The first ideas is to allow `self = nil` inside failable initializers 
(essentially making `self` look like `inout Self?` instead of `inout Self` with 
magical `return nil`), so that all initializers uniformly can be written in 
`self = ...` form for clarity and convenience purposes. This should, 
theoretically, be nothing but a `defer { return nil }` type of rewrite, so I 
don't see any major difficulties implementing this. This is especially useful 
for failable-initializing enums where the main switch simply assigns to self in 
all cases and the rest of the initializer does some post-processing.

2. Arbitrary `return` Statements In Intializers

The second idea is to allow `return ...` inside all initializers, which should 
also, theoretically, be a simple rewrite to `self = ...; return`. This one is 
to complement the existing `return nil` and allow some super-short initializers 
with a switch that returns in all cases or a more complex initializer that has 
a lot of guard statements.

2.1. Future Factory Initializers

In addition, the `return ...` syntax has the benefit for potential factory 
initializers. So far, the proposals for factory initializers involved a keyword 
attached to the initializer, which just complicates the lexical structure of 
the language and adds unnecessary complication to the interface of types. 
Currently, factory initializers imported from Objective-C or from C using the 
`__attribute__((swift_name("MyType.init(self:...)")))` look like normal 
initializers (an in case of C, the return value doesn't even have to be related 
to the enclosing type in any way), but behave as you'd expect: you call the 
initializer and the result is a value that *should* be a subtype of the type 
you've called the initializer for. So, if in the future Swift gets native 
factory initializers (including, most importantly, in protocols), it won't 
require special syntax, because simply returning an instance of a subtype (with 
a compile-time check, of course) would look and behave very intuitively. This 
would also be very useful for singletons, which would use a private initializer 
for creating the instance and a public factory initializer for returning it.

3. Failable Member Initialization

The third idea is to allow writing `self.member = MemberType?(...)` or 
`self.member = .init?(...)` (the exact syntax is up to debate) inside failable 
initializers, which would be simply rewritten as:

guard let _self_member = MemberType(...) else {
return nil
}
self.member = _self_member

This will dramatically reduce the boilerplate and visual clutter form complex 
failable initializers that call other failable initializers. A good use case 
would be complex `LosslessStringConvertible` types with many 
`LosslessStringConvertible` members.

So, what do you guys think?

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to