<div style="white-space:pre-wrap">I&#39;m not sure I understand the inconsistency you see. Set and Dictionary require hashable values and keys, respectively. That&#39;s just in the nature of what these types are. Do you want Set itself to conform to Hashable?<br></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Apr 29, 2016 at 12:57 Wolfgang H. via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
A. When trying to declare nested collection types an inconsistency<br>
   is unveiled:<br>
<br>
<br>
A.1. “Array” as outer type allows for every collection type as inner<br>
     type (“Int” used as a placeholder for “some other type”):<br>
<br>
    let test_aa: Array&lt;Array&lt;Int&gt;&gt; = []<br>
        // ok<br>
<br>
    let test_as: Array&lt;Set&lt;Int&gt;&gt; = []<br>
        // ok<br>
<br>
    let test_ad: Array&lt;Dictionary&lt;Int, Int&gt;&gt; = []<br>
        // ok<br>
<br>
<br>
A.2. “Set” as outer type allows for “Set” as inner type only:<br>
<br>
    let test_sa: Set&lt;Array&lt;Int&gt;&gt; = []<br>
        // compile time error “Type &#39;Array&lt;Int&gt;&#39; does not conform to<br>
        // protocol &#39;Hashable&#39;”<br>
<br>
    let test_ss: Set&lt;Set&lt;Int&gt;&gt; = []<br>
        // ok<br>
<br>
    let test_sd: Set&lt;Dictionary&lt;Int, Int&gt;&gt; = []<br>
        // compile time error “Type &#39;Dictionary&lt;Int, Int&gt;&#39; does not<br>
        // conform to protocol &#39;Hashable&#39;”<br>
<br>
<br>
A.3. The same is true for “Dictionary” as outer type:<br>
<br>
    let test_da: Dictionary&lt;Array&lt;Int&gt;, Int&gt; = [:]<br>
        // compile time error “Type &#39;Array&lt;Int&gt;&#39; does not conform to<br>
        // protocol &#39;Hashable&#39;”<br>
<br>
    let test_ds: Dictionary&lt;Set&lt;Int&gt;, Int&gt; = [:]<br>
        // ok<br>
<br>
    let test_dd: Dictionary&lt;Dictionary&lt;Int, Int&gt;, Int&gt; = [:]<br>
        // compile time error “Type &#39;Dictionary&lt;Int, Int&gt;&#39; does not<br>
        // conform to protocol &#39;Hashable&#39;”<br>
<br>
<br>
B. When letting Swift infer the type of collections of “Array” from<br>
   literals another inconsistency comes to light:<br>
<br>
<br>
B.1. “Array” as outer type behaves IMHO perfectly:<br>
<br>
    var testArray = [ [ 1, 2, 4, 8 ], [ 1, 3, 9, 27 ] ]<br>
    print(testArray.dynamicType)<br>
        // prints “Array&lt;Array&lt;Int&gt;&gt;”<br>
    testArray.append( [ 1, &quot;five&quot;, 25, 625 ] );<br>
        // compile time error “Cannot convert value of &#39;String&#39; to<br>
        // expected element type &#39;Int&#39;”; type safe<br>
<br>
<br>
B.2. “Set” as outer type works but there is no type safety:<br>
<br>
    var testSet: Set = [ [ 1, 2, 4, 8 ], [ 1, 3, 9, 27 ] ]<br>
    print(testSet.dynamicType)<br>
        // prints “Set&lt;NSArray&gt;”<br>
    testSet.insert( [ 1, &quot;five&quot;, 25, 625 ] )<br>
        // neither run time nor compile time errors; no type safety<br>
<br>
<br>
B.3. The same goes for “Dictionary” as outer type:<br>
<br>
    var testDictionary = [<br>
        [ 1, 2, 4, 8 ]: &quot;Powers of Two&quot;,<br>
        [ 1, 3, 9, 27 ]: &quot;Powers of Three&quot;,<br>
    ]<br>
    print(testDictionary.dynamicType)<br>
        // prints &quot;Dictionary&lt;NSArray, String&gt;&quot;<br>
    testDictionary[ [ 1, &quot;five&quot;, 25, 625 ] ] = &quot;Powers of Five&quot;<br>
        // neither run time nor compile time errors; no type safety<br>
<br>
<br>
<br>
— — - Wolfgang H.<br>
<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div>