> On Jun 8, 2016, at 11:54 AM, Антон Жилин via swift-evolution > <[email protected]> wrote: > > The difference between nil and .none is that the former is more "generic" > than the latter. > > NilLiteralConvertible protocol expresses types that can contain "null" as > legal values. `nil` does not have a type, it's just a token that is casted to > whatever NilLiteralConvertible type is expected. It is used in JSON > libraries, for example: > > let tree: JSON = ["name": "Alex", "age": 20, "email": nil] > > Here, nil would be inferred to have our custom JSON type. > The same example with none would look a bit more weird: > > let tree: JSON = ["name": "Alex", "age": 20, "email": none] > > None of what type? Of String? Of Int? Of JSON? There are no optionals in this > code. And a "null" present in JSON is different than no JSON in Swift.
I have seen an example like this several times. In every case, I find the “none” one to be clearer. Why? Because it indicates that there is no email. nil to me looks like it could be a null pointer that could have bad consequences when accessed nil is special word that we are use to from other languages. It *sounds* natural in this case because it is familiar. I am not familiar with JSON libraries, but I don’t think that should guide the direction on which way to go. Also, I am more specifically referring to nil with the use of optionals, not NilLiteralConvertible: let i: Int? = nil let i: Int? = .none There are two ways to write the same thing with one being far clearer in my opinion. What does nil mean in this case? It precisely represents Optional<Int>.none making it somewhat redundant and surprising considering how nil is used in other languages. More specifically, what is nil? 0? A pointer? A representation of nothing (again implying none!)? I am very curious how new programmers coming to Swift as their first language would react to using nil in other languages. I think they would be very surprised. > > Optional is the most significant example of NilLiteralConvertible, but there > are other users that would suffer from renaming. We could remove > NilLiteralConvertible at all, but look at the example in this case: > > let tree: JSON = ["name": "Alex", "age": 20, "email": JSON.nullValue] This is somewhat more explicit and clearer in my opinion. Again, I am not familiar with JSON libraries so this could be why it looks clearer to me. >From your response, I see the words “nil”, “null”, and “none”. Doesn’t this >seem a little excessive and maybe confusing for people? Thanks, Brandon > > That would hurt immersion of the DSL. > > I think some Core team member told that they intentionally keep two ways of > handling Optional: one using nil, and the other treating it like other enums. > > - Anton > _______________________________________________ > swift-evolution mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
