[swift-evolution] Type Safe Key-Value Construct

David Moore mooredev at me.com
Sat Jun 10 11:56:42 CDT 2017


  
  

    
  
  
>   
>     
>  Hello swift-evolution,  
>
>   
> There are clearly weaknesses with obtaining values from a given dictionary in swift. Most notably, if we have a [String: Any] dictionary, how is one supposed to set/get a value with type safety? The following concept addresses this very issue.
>   
>
>   
> I regularly use a self-constructed structure with static constants embedded within it, the structure enables a type safe implementation of keys and values (especially Dictionary applications). I will include a code snippet later on in this message, but I would specifically like to describe the benefits of a type safe key and value system, and how it would benefit the language.   
>   
>
>   
> When using dictionaries in Swift, one often finds themselves needing to use more general key and value types (e.g. [String: Any]). Unfortunately, when a Dictionary uses a general type, rather than one with more type safety and compile time checks, many issues can arise from such a use case.
>   
>
>   
> The solution, in my opinion, is to use a pairing struct which can be used to create constant type-safe-enforcing structures. Additionally, said struct could have the ability to transform values of one type to that of another. Please see the code snippet below for more information regarding the implementation.
>   
>
>   
> >   
> >   
> >  struct  Bar {
> >   
> >           var  str:  String
> >   
> >  }
> >   
> >   
> >   
> >   var  foo = [String:  Any]()
> >   
> >   foo["bar"] =   Bar(str:  "Hello, world.")
> >   
> >   
> >   
> >  // We are optionally casting this value of `Any` to `Bar`, but it's strongly typed, so there are clearly drawbacks.
> >   
> >   if   let  bar =  foo["bar"]  as?  Bar  {
> >   
> >          bar.str
> >   
> >  }
> >   
> >   
> >   
> >  // What if we use a `KeyValuePair`?
> >   
> >   let  barPair =  KeyValuePair<String,  Any,  Bar>(key:  "bar")
> >   
> >   barPair.addValue(Bar(str:  "This is better."), to:  &foo)
> >   
> >   
> >   
> >  // Now look how easy (and safe) it is to get the value.
> >   
> >   let  bar =  barPair.value(from:  foo)
> >   
> >   
>   
>   
> I have already implemented the underlying structure for the above example usage. Also, there are other use cases that are not highlighted here, such as built in value transformation.   
>   
>
>   
> Let me know if anyone else agrees that this is a type safe solution for generalized dictionaries, or if think there are other uses for it. I also have all the code for the struct KeyValuePair, if anyone wants to see how it works, but it’s quite lightweight.
>   
>
>   
> Thank you,
>   
>   
>   
>   
>   
>
>   
>
>   
>
>   David Moore   /   Owner / Chief Executive Officer   
>    david at mooredev.ca (mailto:david at mooredev.ca)   /   (705) 845-6057
>
>   
>
>   Moore Development   
>    https://www.mooredev.ca
>
>   
>
>   
>
>   
>
>   
>
>   
>
>   
>
>   
>   
>   
>   
  
  
   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170610/1cf982b0/attachment.html>


More information about the swift-evolution mailing list