>   
>     
>  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   
>    [email protected] (mailto:[email protected])   /   (705) 845-6057
>
>   
>
>   Moore Development   
>    https://www.mooredev.ca
>
>   
>
>   
>
>   
>
>   
>
>   
>
>   
>
>   
>   
>   
>   
  
  
   
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to