Hi Tony, thanks for the response!

In regards to why an enum w/ associated values:

- It avoids creating additional storage.  (Admittedly, a very small amount, but 
the point still stands.)
- It deterministically defines that it’s either one or the other, and guards 
against someone trying to be clever and setting both the Pipe and Handle 
properties.  Even if we do have a safeguard for that (like “setting the Pipe 
property nils out the File Handle property” and vice-versa), making it a 
type-safe enum improves API clarity.  I’m generally not a fan of implicit API 
behaviors that require reading the fine print, and while they are necessary 
sometimes, I’d much prefer the class’s declaration makes it clear from the 
get-go.  
- Furthermore on the previous point, it helps encourage safer client usage 
patterns for callers getting pre-launched NSTask objects from opaque factory 
methods.  (I don’t see this pattern out in the wild very much, but I don’t want 
to rule it out, especially if Swift starts taking off on the server-side).

Dan

> On Dec 17, 2015, at 12:31 PM, Tony Parker <anthony.par...@apple.com> wrote:
> 
> Hi Dan,
> 
> Thank you for your proposal. This is the right place to start discussion of 
> it. If we want to do this then we would have to make changes in both Darwin 
> and open source versions, to maintain source compatibility.
> 
> Out of curiosity, why propose an enum instead of an additional set of typed 
> properties? Looking at the implementation of NSTask, it sure seems like we 
> only expect either a file handle or pipe. I’m not sure if we would ever add 
> another.
> 
> - Tony
> 
>> On Dec 17, 2015, at 11:34 AM, Dan Stenmark via swift-corelibs-dev 
>> <swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org>> wrote:
>> 
>> This is my first proposal to swift-corelibs, so I’m not sure how much 
>> flexibility we have in terms of deviating from the darwin’s original 
>> Foundation definitions.  That said, it’s always seemed a little screwy to me 
>> that NSTask's standardInput/standardOutput/standardError properties 
>> sacrifice any semblance of compile-time type safety by accepting 
>> id/AnyObject (which, at run time, must be either NSPipe or NSFileHandle, 
>> else it blows up).  If allowed, I’d like to take the opportunity to 
>> modernize this in the open source version of Foundation.
>> 
>> public class NSTask : NSObject {
>>     
>> ...    
>> 
>>     public enum IOType {
>>         
>>         case FileHandle(NSFileHandle)
>>         case Pipe(NSPipe)
>>     }
>>     
>>     public var standardInput: NSTask.IOType?
>>     public var standardOutput: NSTask.IOType?
>>     public var standardError: NSTask.IOType?
>> 
>> ...
>> 
>>    
>> }
>> 
>> Dan
>> 
>> _______________________________________________
>> swift-corelibs-dev mailing list
>> swift-corelibs-dev@swift.org <mailto:swift-corelibs-dev@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-corelibs-dev
> 

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

Reply via email to