I noticed in our code that we had one occurrence of 

    #selector(SomeClass().someFunction)

which to my eyes looked like a bug. 
Disallowing arbitrary expressions looks very reasonable to me and would help 
catch small mistakes like this one. 

> 29 apr. 2016 kl. 16:40 skrev Thorsten Seitz via swift-evolution 
> <[email protected]>:
> 
> Looks good to me!
> 
> -Thorsten 
> 
>> Am 28.04.2016 um 16:56 schrieb Alex Hoppen via swift-evolution 
>> <[email protected]>:
>> 
>> During the implementation of SE-0064 (Referencing Objective-C selector of 
>> property getters and setters) I have come across an issue that could be 
>> resolved my a minor change to the language and simplify the compiler a lot. 
>> I have drafted a proposal below.
>> 
>> Thoughts, comments, especially objections, appreciated.
>> 
>> – Alex
>> 
>> GitHub-Link: 
>> https://github.com/ahoppen/swift-evolution/blob/arbitrary-expressions-in-selectors/proposals/0000-arbitrary-expressions-in-selectors.md
>> 
>> Disallow arbitrary expressions in selectors
>> Proposal: SE-NNNN
>> Author(s): Alex Hoppen
>> Status: Draft
>> Review manager: TBD
>> Introduction
>> It is currently possible to write arbitrary expressions inside #selector 
>> like the following: #selector(callThisFunc().bar). This complicates the 
>> implementation of proposals SE-0064 (Referencing Objective-C selector of 
>> property getters and setters) and SE-0062 (Referencing Objective-C 
>> key-paths) a lot. 
>> 
>> This proposal restricts expressions inside selectors to be a sequence of 
>> property or method refernces. I believe this will not be a major 
>> restrictions since arbitrary expressions in selectors are probably rarely 
>> used, have some rough edges and removing them would simplify the compiler.
>> 
>> Proposed solution
>> I propose allowed expressions inside #selector (and once implemented 
>> #keyPath) to be a series of instance or class members separated by . and 
>> allow disambiguating the last component using as.
>> 
>> Detailed design
>> Examples
>> 
>> class Address: NSObject {
>>   dynamic var street: String
>>   dynamic var town: String
>> 
>>   init(street: String, town: String) {
>>     self.street = street
>>     self.town = town
>>   }
>> }
>> 
>> class Person: NSObject {
>>   dynamic var name: String
>>   dynamic var homeAddress: Address
>> 
>>   func workAddress() -> Address {
>>     // ...
>>   }
>> 
>>   func workAddress(formatter: AddressFormatter) -> String {
>>     // ...
>>   }
>> 
>>   init(name: String, homeAddress: Address) {
>>     self.name = name
>>     self.homeAddress = homeAddress
>>   }
>> }
>> 
>> let me: Person = ...
>> The following examples will continue to work:
>> 
>> let _ = #selector(getter: Person.name)
>> let _ = #selector(getter: me.name)
>> 
>> let _ = #selector(getter: Person.homeAddress.street)
>> // Could also be written as
>> let _ = #selector(getter: Address.street)
>> 
>> let _ = #selector(Person.workAddress as () -> Address)
>> let _ = #selector(Person.workAddress(formatter: ))
>> I propose removing this kind of selector:
>> 
>> // Should produce selector "street". Note that the method workAddress() is 
>> never 
>> // called and its return type only used during type checking
>> let _ = #selector(getter: me.workAddress().street) 
>> 
>> // The above can be rewritten in a cleaner way like the following
>> let _ = #selector(getter: Address.street)
>> The proposed way to rewrite the selector elimininates potential confusion 
>> about the fact that calling a method inside #selector actually doesn't 
>> invoke it.
>> 
>> Grammar
>> 
>> selector → #selector(selector-modiferopt selector-path)
>> 
>> selector-modifier → getter:
>> selector-modifier → setter:
>> 
>> selector-path → type-identifier . selector-member-path as-disambiguationopt
>> selector-path → selector-member-path as-disambiguationopt
>> 
>> selector-member-path → identifier
>> selector-member-path → unqualified-name
>> selector-member-path → identifier . selector-member-path
>> 
>> as-disambiguation → as type-identifier
>> For a further rationale on why arbitrary expressions are no longer possible, 
>> see the discussion on bugs.swift.org.
>> 
>> Impact on existing code
>> Code that currently uses this feature needs to be rewritten as described in 
>> the example above. I believe, however, that the feature is rarely used so it 
>> will affect only very little source code and where it is currently used the 
>> proposed update is actually more readable.
>> 
>> Alternatives considered
>> The only alternative I see is trying to keep the current semantics and 
>> implement them for the getter:/setter: selectors.
>> 
>> 
>> _______________________________________________
>> 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
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to