[swift-users] Unsubscribe
Howard Perlman
howardp.stainedglass at yahoo.com
Fri Jul 14 11:59:45 CDT 2017
Unsubscribe
From: "swift-users-request at swift.org" <swift-users-request at swift.org>
To: swift-users at swift.org
Sent: Friday, July 14, 2017 12:57 PM
Subject: swift-users Digest, Vol 20, Issue 13
Send swift-users mailing list submissions to
swift-users at swift.org
To subscribe or unsubscribe via the World Wide Web, visit
https://lists.swift.org/mailman/listinfo/swift-users
or, via email, send a message with subject or body 'help' to
swift-users-request at swift.org
You can reach the person managing the list at
swift-users-owner at swift.org
When replying, please edit your Subject line so it is more specific
than "Re: Contents of swift-users digest..."
Today's Topics:
1. Swift 4 emulating Decoder behaviour (Joanna Carter)
----------------------------------------------------------------------
Message: 1
Date: Thu, 13 Jul 2017 20:46:20 +0200
From: Joanna Carter <joanna at carterconsulting.org.uk>
To: swift-users at swift.org
Subject: [swift-users] Swift 4 emulating Decoder behaviour
Message-ID:
<A8DE64E2-5360-4B35-87D2-69F3F5B562E7 at carterconsulting.org.uk>
Content-Type: text/plain; charset=utf-8
Greetings
I notice that, with Swift 4, I can decode an object like this :
• let retrievedSpot = try decoder.decode(ParkingSpot.self, from: retrievedData)
And that will return a ParkingSpot, as expected, into retrievedSpot.
However, I thought I would try the same technique with one of my pet projects…
I have a protocol and an implementing struct :
• public protocol PropertyProtocol
• {
• static var propertyType: Any.Type { get }
•
• var untypedValue: Any? { get }
• }
•
• public struct Property<valueT : DefaultValueProvider> : PropertyProtocol
• {
• public static var propertyType: Any.Type
• {
• return valueT.self
• }
•
• public var untypedValue: Any?
• {
• return value
• }
•
• public var value = valueT()
• }
Now, I want to be able to use a "factory" method to create an instance of Property<T>, bound to its parameter type. So, I followed the same principal as Decoder :
• struct PropertyFactory
• {
• static func createProperty<T>(_ type: T.Type) -> PropertyProtocol where T : DefaultValueProvider
• {
• return type.createProperty()
• }
• }
DefaultValueProvider is defined as follows and String is extended to conform to it :
• public protocol DefaultValueProvider
• {
• init()
• }
•
• extension String : DefaultValueProvider { }
Now, this works fine if I pass a known type :
• let pproperty = PropertyFactory.createProperty(String.self)
But, if I hold the type to be passed in in an Any.Type or DefaultValueProvider.Type variable, then doing this :
• let type: Any.Type = String.self
•
• if let propertyType = type as? DefaultValueProvider.Type
• {
• let p = PropertyFactory.createProperty(propertyType)
•
• …
Fails to compile with the message : Cannot invoke 'createProperty' with an argument list of type '(DefaultValueProvider.Type)'
Likewise Decoder.decode(…) will not accept storing the type in an Any.Type or Decodable.Type variable.
I find this odd and perplexing. Is this a known issue or has nobody yet realised that this could be useful ?
Joanna
--
Joanna Carter
Carter Consulting
------------------------------
_______________________________________________
swift-users mailing list
swift-users at swift.org
https://lists.swift.org/mailman/listinfo/swift-users
End of swift-users Digest, Vol 20, Issue 13
*******************************************
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170714/98c31087/attachment.html>
More information about the swift-users
mailing list