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

Reply via email to