[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