> On Jun 20, 2017, at 2:25 PM, Travis Griggs <travisgri...@gmail.com> wrote:
> 
>> 
>> On Jun 20, 2017, at 7:02 AM, David Baraff via swift-users 
>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>> 
>> I posted this on Apple’s developer forums, and someone suggested trying this 
>> here.
>> Basically, see https://forums.developer.apple.com/thread/80349 
>> <https://forums.developer.apple.com/thread/80349>
>> 
>> but in a nutshell: consider that a widely used class/struct (such as 
>> CGPoint) is missing some “obvious” functionality [don’t debate that part, 
>> just go with it for now], such as the ability to scale a point by a scalar 
>> using * as an operator: so in my awesome library “GeometryBase” I write
>> 
>>   public func * (left: CGPoint, right: double) -> CGPoint {
>>       return CGPoint(x: right*left.x, y: right*left.y)
>>   }
>> 
>> Why public?  Well, of course, because I want to use library GeometryBase in 
>> many apps or other libraries, and now this overload exists in only one place.
>> 
>> But other bright people have the same idea, and now I want to use their 
>> libraries.  (some of them in my company, some of them not.)
>> 
>> And now we’re stuck, because everyone is trying to make up for the same 
>> (perceived) lack and everyone wants them public so that they don’t have to 
>> keep sticking them in each library they write.
>> 
>> This is not a made up situation: many people even within one company trying 
>> to share code somewhat informally are going to write the same code to make 
>> using CGPoint/Size/Rect easier, and now we can’t share anything safely.
>> 
>> Anybody got some good ideas what to do about this?
>> 
>> [Same question could apply to adding extensions.]
> 
> I don’t have a good idea how to solve the problem. We dealt with this type of 
> thing many years ago in Smalltalk systems.
> 
> Strategically, when I write application code for end user consumption, I will 
> use my goodly sized library of base library extensions. But when I’m writing 
> a framework to be used by other programmers, I swear off the extensions. If 
> there is an extension that is just so essential, I’ll restrain its scope as 
> much as possible, both with ACLs as well as obvious name prefixes:
> 
>       extension CGPoint {
>               var radius_myFramework:CGFloat {
>                       return sqrt((self.x * self.x) + (self.y * self.y))
>               }
> 
> This doesn’t do much for infix signatures though.
> 
> That said, I’m glad to have this problem in Swift. I’m willing to live with 
> the hassle it can create. The gain is worth it. I hate that Python won’t let 
> me extend base types.

Also, reading about Kotlin recently, I found the exposition of extensions 
interesting:

https://kotlinlang.org/docs/reference/extensions.html 
<https://kotlinlang.org/docs/reference/extensions.html>

In particular the part about them being resolved statically. I’ve wondered if 
this helps obviate this conflict problem, but I haven’t thought through it 
enough yet.

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to