Thanks for your detailed comments!

Something I’ve realised through this is that you need to be really careful 
about upgrading your system on a development machine. Going from 10.12 to 10.13 
- and finding that pasteboard functions compile just fine but no longer work - 
is almost as big a jump as going from Swift 3 to Swift 4.

I don’t think there's a non-hacky way to upgrade to a new system while 
continuing to use the previous SDK, but there should be! What I’d like is 
something similar to Swift transitions: Xcode could issue warnings and make 
similar helpful suggestions.

Jeremy

--

> On 20 Dec 2017, at 05:03, Quincey Morris 
> <quinceymor...@rivergatesoftware.com> wrote:
> 
> On Dec 19, 2017, at 18:32 , Jeremy Hughes <moon.rab...@virginmedia.com> wrote:
>> 
>>> On 20 Dec 2017, at 02:22, Jeremy Hughes <moon.rab...@virginmedia.com> wrote:
>>> 
>>> What I don’t like about [NSArray.self] is that it’s an artefact of 
>>> bridging. I’m not actually using it in the encoder:
>>> 
>>> coder.encode(arrayOfInts, forKey: kArrayKey)
>> 
>> The declaration:
>> 
>> encode(_ object: Any?, forKey key: String)
>> 
>> seems to indicate that it encodes any object
> 
> Yeah, you’re right, it’s secure on the decoding side only. 
> 
> This “encode” method is @objc, as I think you already noted, which AFAIK 
> means that if the value is an array, it’s going to be automatically bridged 
> to a NSArray. I would also expect it to become NSArray<NSNumber*>*, but I 
> can’t remember the rules, so I won’t go out on that limb. I also haven’t 
> looked at secure decoding recently, so I don’t know why or if the absence of 
> the element type matters when you’re securely decoding. It used to.
> 
> Note that the first parameter (“Any?”) doesn’t have to be an object in Swift, 
> although an object reference is required for the Obj-C method underneath. If 
> it’s a non-object in Swift, it’s actually passed as an opaque object that 
> wraps the Swift value.
> 
> After a while, you start to feel you need a ouija board to figure this stuff 
> out. As an alternative, if you are in control of both encoding and decoding, 
> and don’t need Obj-C compatibility inside the archive, you might do better to 
> use encode/decodeEncodable instead of encode/decodeObject. That takes type 
> bridging out of the picture, and trill preserves Swift types.
> 
> The last piece of this is that you should use one of the “decodeTopLevel…” 
> methods to decode the root object of your archive, for example 
> “decodeTopLevelDecodable(_:forKey:)”. This enables the relatively new — only 
> 5 years old! — failable decoding mechanism, where an error is thrown at the 
> top level if any of the decoding fails anywhere in the archive, 
> distinguishing failure from an init?(coder:) method that merely returns nil 
> to signify an optional value that isn’t present. (You use “failWithError” to 
> supply an error if you need to fail the decoding.)
> 
> Putting all that together, you can use NSKeyedArchiver/Unarchiver to encode 
> and decode more or less completely in the Swift domain (Codable), with proper 
> error handling and no obscure messing around with the types.

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to