[swift-evolution] [Discussion] Using dot prefixes to infer non-enumeration static members
Howard Lovatt
howard.lovatt at gmail.com
Tue Feb 16 18:59:33 CST 2016
Hi Jordan,
Yes implementing `==` will patch the example I gave, but it isn't a general
solution. Consider this variation:
class Static: Equatable {
class One: Static {}
static let one = One()
class Two: Static {}
static let two = Two()
func e() -> String {
switch self {
case Static.one:
return "one"
case Static.two :
return "two"
default:
return "unknown"
}
}
}
func ==(lhs: Static, rhs: Static) -> Bool {
return lhs === rhs
}
Still needs the type qualifiers :(.
-- Howard.
On 17 February 2016 at 11:31, Jordan Rose <jordan_rose at apple.com> wrote:
> That works just as well outside the enum:
>
> enum Enum {
> case one
> case two
> }
>
> func e(value: Enum) -> String {
> if value == .one {
> return "one"
> } else if value == .two {
> return "two"
> }
> return "unkown"
> }
>
>
> Here it's looking in the contextual type provided by ==. The enum
> synthesizes a function along the lines of
>
> func ==(a: Enum, b: Enum)
>
>
> This doesn't work for === because you can compare identity across class
> types.
>
> func ===(a: AnyObject, b: AnyObject)
>
>
> Jordan
>
>
> On Feb 16, 2016, at 16:20, Howard Lovatt <howard.lovatt at gmail.com> wrote:
>
> @Jordan,
>
> You said "I don't think we want to change or overload that rule to also
> look up static members of the *enclosing lexical context type* (i.e. the
> type of 'self')." But you do already; inside an enum, e.g.:
>
> enum Enum {
> case one
> case two
> func e() -> String {
> if self == .one {
> return "one"
> } else if self == .two {
> return "two"
> }
> return "unkown"
> }
> }
>
> Compared to inside a static:
>
> class Static {
> class One: Static {}
> static let one = One()
> class Two: Static {}
> static let two = Two()
> func e() -> String {
> if self === Static.one {
> return "one"
> } else if self === Static.two {
> return "two"
> }
> return "unknown"
> }
> }
>
> Why so different? The enum version looks inside the type `Enum` to find
> `.one` and `.two`, but the static version doesn't look inside the type
> `Static` and hence you have to say `Static.one` and `Static.two` :(
>
> -- Howard.
>
> On 16 February 2016 at 05:40, Jordan Rose via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>>
>> On Feb 15, 2016, at 8:58, Erica Sadun via swift-evolution <
>> swift-evolution at swift.org> wrote:
>>
>> While discussing leading enumeration dot prefixes, Howard Lovatt asked
>> why static properties and methods could not be inferred via a dot prefix as
>> well. Based on Swift-Evolution conventions, here's a new thread to discuss
>> this idea: specifically, would it be beneficial (and/or possible) to use
>> dot prefixes to denote static member references in instance member code.
>>
>> Howard wrote:
>>
>> +1 for the proposal, it is wierd to use `.` in some places and not
>> others.
>>
>> On the subject of static methods and properties in general, would it be
>> possible for `.name` to be a reference to a static and `name` a reference
>> to an instance? EG:
>>
>> .name = x // static
>> name = x // instance
>> x = name + .name // instance + static
>> r = name ... .name // instance ... static, needs space
>> r = name...Type.name // Can still qualify with type name
>>
>>
>> Under the current system, you must explicitly name or derive a type to
>> access static members from instance member implementations.
>>
>> struct MyStruct {
>> static func staticMember() {}
>>
>> func instanceMember() {
>> // name a type
>> MyStruct.staticMember() // works
>>
>> // derive a type
>> self.dynamicType.staticMember() // works
>>
>> // error: value of tuple type '()' has no member 'staticMember'
>> // does not work
>> .staticMember()
>> }
>> }
>>
>> Using dot prefixes for static member access:
>>
>> * Has precedent in enumeration members
>> * Would streamline Swift code
>> * Is visually differentiated from `self`-prefixed instance member
>> references
>>
>> What are your thoughts, both technical and philosophical, on a change
>> like this? Thanks in advance for your feedback.
>>
>>
>> Dot-prefixed member expressions are currently looked up as static members
>> of the* contextual type,* which lets you do things like this:
>>
>> import AppKit
>> let colors: [NSColor] = [.redColor(), .blueColor()]
>>
>>
>> I don't think we want to change or overload that rule to also look up
>> static members of the *enclosing lexical context type* (i.e. the type of
>> 'self').
>>
>> Jordan
>>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160217/6d60b7ad/attachment.html>
More information about the swift-evolution
mailing list