> IMO dictionary [Type1:Type2?] is a special case where you need to use > myDict.keys.contains(keyValue) first to determinate if you have a value for > key and after this you can get the value itself(which is Optional).
I don’t understand why you think it is a special case. The return type of subscripting [ T1 : T2?] is T2?? or Optional<Optional<T2>>. You can do all the normal unwrapping you would expect except that one unwrapping results in another optional e.g. --- var sqrt: [Int : Int?] = [ 1: 1, 4 : 2, 2 : nil] func tellMeTheSquareRoot(n : Int) -> String { if let lookupResult = sqrt[n] { if let theSquareRoot = lookupResult { return "\(n) has a square root and it is \(theSquareRoot)" } else { return "\(n) has a square root but it is not an integer" } } else { return "I can't imagine what the square root of \(n) might be" } } print(tellMeTheSquareRoot(4)) print(tellMeTheSquareRoot(2)) print(tellMeTheSquareRoot(-1)) — gives the results 4 has a square root and it is 2 2 has a square root but it is not an integer I can't imagine what the square root of -1 might be Comparing to nil is ambiguous to the human eye but the compiler makes a decision sqrt[2] == nil // false (huh?) sqrt[-1] == nil // true The reason the first one is false is because the return result is not nil but Optional<Optional<Int>>.Some(Optional<Int>.None>) A similar rule applies to assignment to a subscript, the compiler assumes the “top level” of optional but you can force the addition of an element with a nil value by being explicit. sqrt[2] = nil // [4: Optional(2), 1: Optional(1)] - 2 has been zapped sqrt[2] = Optional<Int>.None // [2: nil, 4: Optional(2), 1: Optional(1)] - 2 has been re-added _______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution