Hi Ole,

> On Dec 5, 2016, at 5:11 AM, Ole Begemann via swift-corelibs-dev 
> <swift-corelibs-dev@swift.org> wrote:
> 
> (Apologies if this is not the right list to ask this question. I couldn't 
> decide between swift-corelibs-dev and swift-dev.)
> 
> I noticed that the NSArray and NSDictionary initializers to create a 
> collection from a property list file are not exposed in the stdlib Array and 
> Dictionary types. The same is true for the corresponding methods to write a 
> collection to a property list:
> 
> – init?(contentsOfFile:)
> – init?(contentsOfURL:)
> – write(toFile:atomically:)
> – write(to:atomically:)
> 
> You can still call these from Swift by using NSArray or NSDictionary directly.
> 
> My question is why this decision was made, purely out of interest and because 
> I couldn't find any information about this. I can imagine a few reasons:
> 
> 1) Property lists are quite specific to Apple platforms and we don't want to 
> "pollute" the standard library with platform-specific solutions.
> 
> 2) Plists are just one of several potentially useful file formats and users 
> might assume that an initializer to deserialize a collection from a file also 
> supported other file formats, such as JSON or YAML, especially with a generic 
> name like init(contentsOfFile:).
> 
> 3) The resulting collections are heterogeneously typed ([Any] or 
> [String:Any]) and as such not very pleasant to work with in Swift, so Array 
> and Dictionary are really considered to be the wrong types to offer this 
> functionality. It would be preferable to have a separate data type for 
> working with plists, something like:
> 
> enum PropertyList {
>    case text(String)
>    case bool(Bool)
>    case int(Int)
>    case double(Double)
>    case date(Date)
>    indirect case array([PropertyList])
>    indirect case dict([String: PropertyList])
> }
> 
> Thanks!
> Ole
> 

The main reason is actually that we just prefer people use 
NSPropertyListSerialization API to read or write property lists. One big 
reason: that API has the possibility of giving you an error, whereas the 
collection methods do not.

The collection API is a trivial convenience method over property list 
serialization anyway. Here is the implementation:

    data = [[NSData allocWithZone:NULL] initWithContentsOfFile:path];
    if (!data) return nil;
    id plist = [[NSPropertyListSerialization propertyListWithData:data 
options:immutable ? NSPropertyListImmutable : NSPropertyListMutableContainers 
format:NULL error:NULL] retain];
    [data release];

Plus an additional check to make sure the result is the right type (array or 
dictionary).

- Tony


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

Reply via email to