It's an interesting implementation, from my cursory look. Inspired by the 
bridging wrappers that the rest of the Swift Overlay uses, and with a massive 
performance win in Swift-only uses. Awesome!

It still holds the fundamental oddities of NSProgress that I find weird. Like 
"current progress" always strikes me as very odd concept.

I'd be interested to see what Tony Parker and the Core Team think!

On 22 Feb 2017, at 8:22 am, Charles Srstka <cocoa...@charlessoft.com> wrote:

>> On Feb 21, 2017, at 2:52 PM, Rod Brown <rodney.bro...@icloud.com> wrote:
>> 
>> Ah sorry! To be honest, I didn't see the part about your interoperability 
>> with NSProgress trees!
>> 
>> That said, it does seem to be a hacky solution. A better solution would be a 
>> backing NSProgress that is linked and lazily created when casts occur, 
>> perhaps? This would map far cleaner to current bridging techniques in the 
>> Swift Overlay?
>> 
>> Sorry, I haven't looked at how your internal implementation is done. I'm 
>> just going off the description in your email. I'm curious to get involved in 
>> creating a better progress API if we can find a way that is superior and 
>> still cleanly interoperates.
> 
> Agreed that it’s hacky, which is why I tried to do my best to separate the 
> Objective-C compatibility crud from the rest of the code, so it can be easily 
> yanked and replaced with something better if we think of one.
> 
> With that said, the way I’m currently doing it is inspired by the way the 
> Data<->NSData bridging works. My class, CSProgress, has a “backing” property. 
> This property stores an enum with two cases, one for Swift, and one for 
> Objective-C. The Swift backing contains the basic implementation, and the 
> Objective-C one wraps an NSProgress, forwarding all changes to it and 
> registering for KVO notifications on it for the purpose of keeping its own 
> clients notified. Each case contains an associated type that handles all the 
> primitives. There’s also a private NSProgress subclass (unimaginatively named 
> “BridgedNSProgress”) that wraps a CSProgress, and forwards NSProgress changes 
> to it.
> 
> What you get if you:
> 
> - create a CSProgress from scratch, or from another CSProgress: A CSProgress, 
> with the Swift backing.
> 
> - bridge an NSProgress to a CSProgress: If the NSProgress was a 
> BridgedNSProgress, you get the CSProgress it was wrapping. Otherwise, you get 
> a CSProgress with the Objective-C backing.
> 
> - bridge a CSProgress to an NSProgress: If the CSProgress uses the 
> Objective-C backing, you get the NSProgress it was wrapping. Otherwise, you 
> get a BridgedNSProgress wrapping the CSProgress.
> 
> If no bridging occurs and you’re using CSProgress all the way down, no 
> NSProgress objects get involved.
> 
> Charles
> 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to