[swift-evolution] [Idea] "Add needless words" to Objective-C method names

David Owens II david at owensd.io
Wed Feb 24 13:07:16 CST 2016


+1 to this. The rules are getting extremely complicated to keep straight already, adding more special cases doesn't help.

If the API name sucks, there's already a mechanism to change how it's exported to ObjC.

-David


> On Feb 24, 2016, at 12:31 AM, Radosław Pietruszewski via swift-evolution <swift-evolution at swift.org> wrote:
> 
> I don’t think `objectAt:` or `conformsTo:` are that bad, even in Objective-C.
> 
> It’s not standard naming practice, perhaps, but I’m not sure it’s worth having *another* automatic translation/re-naming mechanism to optimize for Objective-C’s conventions. I’m sure there are cases now where translating good Swift names produces ObjC results you can’t live with — and that sucks because then you have to do @objc. But with an automatic translator like what you’re suggesting, maybe most methods will be somewhat more ObjC-like, but you’ll *still* have results you’ll have to correct with @objc. Perhaps even more of them.
> 
>> The primary benefit to doing this is that we’ll produce slightly better Objective-C selectors in cases where we would be producing very bad ones (trailing prepositions are *rarely* used in Objective-C),
> 
> Rarely used, sure. Uncomfortable, yes. But again, I don’t see how “conformsTo:” or even “objectAt:" is *very bad*.
> 
> — Radek
> 
>> On 24 Feb 2016, at 06:25, Douglas Gregor via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> Hi all,
>> 
>> One interesting aspect of the Swift API guidelines is that the obvious mapping from Swift method names to Objective-C selectors produces poor method names for Objective-C code. For example, this
>> 
>> 	func object(at index: Int) -> AnyObject { /* … */ }
>> 
>> will produce the Objective-C selector “objectAt:”, which is not great for Objective-C, where one rarely has a preposition at the end of a selector piece.
>> 
>> This will, in general, be an issue because the naming guidelines for Swift and Objective-C differ so much. We could potentially improve those cases where we have an argument label that ends in a preposition (like this example) by appending the parameter name when we’re forming the selector. For the object(at:) method above, it would produce the selector “objectAtIndex:”.
>> 
>> We would probably want to strip a leading article (a/an/the) from the parameter name, so that:
>> 
>> 	func conforms(to aProtocol: Protocol) -> Bool { /* … */ }
>> 
>> ends up with the selector “conformsToProtocol:” (good) rather than “conformsToAProtocol:” (not so good).
>> 
>> The primary benefit to doing this is that we’ll produce slightly better Objective-C selectors in cases where we would be producing very bad ones (trailing prepositions are *rarely* used in Objective-C), so (potentially) fewer Swift methods will need to provide Objective-C method names explicitly via @objc(…).
>> 
>> The major downsides are that it is a breaking change for anyone using prepositions as argument labels now (and living with the poor Objective-C names) and that developers won’t be able to guess what Objective-C selector will be formed from a given Swift method without having read this message.
>> 
>> Thoughts?
>> 
>> 	- Doug
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution



More information about the swift-evolution mailing list