Unsubscribe From: "swift-users-requ...@swift.org" <swift-users-requ...@swift.org> To: swift-users@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@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-requ...@swift.org You can reach the person managing the list at swift-users-ow...@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 <joa...@carterconsulting.org.uk> To: swift-users@swift.org Subject: [swift-users] Swift 4 emulating Decoder behaviour Message-ID: <a8de64e2-5360-4b35-87d2-69f3f5b56...@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@swift.org https://lists.swift.org/mailman/listinfo/swift-users End of swift-users Digest, Vol 20, Issue 13 *******************************************
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users