[swift-evolution] Making `.self` After `Type` Optional
jordan_rose at apple.com
Wed Mar 16 13:28:29 CDT 2016
> On Mar 15, 2016, at 12:32, Tanner Nelson via swift-evolution <swift-evolution at swift.org> wrote:
>> On Mar 15, 2016, at 1:54 AM, Charles Constant <charles at charlesism.com <mailto:charles at charlesism.com>> wrote:
>> +1 for junking the .self requirement
>> On Wed, Mar 9, 2016 at 11:14 PM, David Hart via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> I strongly agree for the removal of .self. I remember it being a great source of confusion when I first learned Swift.
>> I had the same experience. It was very disorienting.
>> Now that Dave and Joe have explained its origin as a safety feature, it makes sense. The problem is that there's no way to convey that to the end-user, so it seems like it has some deeper meaning. Then you start second-guessing yourself if there's an error in your code, etc.
> I agree. Swift's type-checking engine is strong enough to merit not needing the redundant `.self` safety check. It feels like I'm doing something wrong when I need to use `.self`.
I do want to note one additional case that will become ambiguous:
let x = [NSURL] // value of type 'Array<NSURL.Type>', or 'Array<NSURL>.Type' ?
let y = [NSURL.self] // definitely the former
let z = [NSURL]() // definitely the latter
I think we have to treat this as the former, and I think the rule is just "if the close bracket is immediately followed by an open paren, it's a type; otherwise it's a value". This definitely affects what `[NSURL].foo` means, too (is it a static or dynamic property?).
We could also restrict the array/dictionary shorthand syntax to type position, but it seems like it's fairly conventional to use "let x = [NSURL]()".
P.S. We actually have this problem today: does `NSURL?.self` have type 'Optional<NSURL.Type>' or 'Optional<NSURL>.Type' ?
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the swift-evolution