<div dir="ltr"><p><code>Any?</code> or <code>AnyObject?</code>; have your dictionary be something like <code>[String: AnyObject?]</code>.</p><div class="gmail_quote"><div><br></div><div dir="ltr">On Sun, Jun 26, 2016 at 3:00 PM Michael Peternell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">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>
&gt; Am 26.06.2016 um 23:03 schrieb Jean-Daniel Dupas via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:<br>
&gt;<br>
&gt; Optional are definitely the best way to represent null when parsing JSON.<br>
&gt;<br>
&gt;&gt; Le 26 juin 2016 à 22:35, Michael Peternell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; a écrit :<br>
&gt;&gt;<br>
&gt;&gt; Just one question: If I have functions<br>
&gt;&gt;<br>
&gt;&gt; json_encode(j: JSON) -&gt; String<br>
&gt;&gt; and<br>
&gt;&gt; json_decode(j: String) -&gt; JSON throws<br>
&gt;<br>
&gt; If the string is valid JSON, it return .some() optional, if ti is empty, it returns .none() optional, and if it is invalid, it throws.<br>
<br>
again, `.none()` is not fully specified. So your answer isn&#39;t really an answer to my question. There is<br>
<br>
let null1: String? = nil<br>
let null2: Int? = nil<br>
let null3: Any? = nil<br>
<br>
and null1, null2 and null3 are three different concrete values. You are making it too easy for yourself when you just say `.none()`, without specifying the type you are referring to.<br>
<br>
Also, `let x = nil` does not even compile, for exactly this reason. So again, how do you want to represent a JSON null in Swift?<br>
<br>
let json_null: ... = ... // ???<br>
let myJSONdict = [&quot;a&quot;:2, &quot;b&quot;:json_null]<br>
<br>
-Michael<br>
<br>
&gt;<br>
&gt;&gt; what should be the type of JSON? What should &#39;{&quot;a&quot;:2,&quot;b&quot;:null}&#39; decode to?<br>
&gt;<br>
&gt; Dictionary&lt;String, Any?&gt;<br>
&gt;<br>
&gt;&gt; What should the type of the JSON null value be in Swift?<br>
&gt;<br>
&gt; Optional&lt;Any&gt;.none()<br>
&gt;<br>
&gt;&gt; I think String and String? and String??? are wrong in this case.<br>
&gt;&gt;<br>
&gt;&gt; I&#39;m not saying that I&#39;m convinced that NSNull() is the best way to represent null in this case. I just want to explain the use case that I was thinking of.<br>
&gt;<br>
&gt; I hardly can think of a better use case than parsing JSON to demonstrate than Optional are a far better solution to represent a null value than NSNull.<br>
&gt;<br>
&gt;&gt; -Michael<br>
&gt;&gt;<br>
&gt;&gt;&gt; Am 26.06.2016 um 19:53 schrieb David Rönnqvist via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I&#39;m not convinced that Swift needs more than on way of representing the lack of a value. As far as I&#39;ve understood (and remember), NSNull main reason to exist is that it&#39;s an actual object and won&#39;t for example terminate array literals. From what I&#39;ve observed of people who are new to Objective-C, NSNull is a big surprise, both its general existence but also when to expect it (read check for NSNull to make sure one doesn&#39;t crash) and when not to.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; The way I&#39;ve imagined that the same problem would be solved in Swift is with an optional, optional value. That is: if a field in a response can either be set or not, that&#39;s an optional. If that field can either contain a value or the explicit lack of a value that&#39;s another optional:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; let nickname: String?? = &quot;Little Bobby Tables&quot;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; As I see it, this is both safer (requiring that the inner nil value is dealt with), serves as a documentation of when an explicit missing value is expected and when it&#39;s not, and is more consistent.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I would still expect a newcomer to wonder why there is two question marks in some places, but I&#39;d imagine that that explanation would feel more logical.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; And it&#39;s (still) possible (at least in the latest Swift Playground) to safely unwrap both levels:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; if case let name?? = nickname { }<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; - David<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Sent from my iPad<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On 24 Jun 2016, at 11:32, Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt;&gt; Not really. What is the type of Optional.none? `let empty = Optional.none` does not compile, it says &quot;Generic parameter &#39;Wrapped&#39; could not be inferred&quot;. NSNull() is a unique concrete value, and it&#39;s compatible with Objective C, NSObject and AnyObject. We could of course use `Optional&lt;Int16&gt;.none`, but someone else may use `Optional&lt;AnyObject&gt;.none` instead. The extra type information is just misleading in this case.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; If you want a single, unique value, use `()`.<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; But I&#39;m not sure why you wouldn&#39;t just make this member an Optional&lt;Any&gt; in the first place. Is there some reason that wouldn&#39;t be suitable?<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; --<br>
&gt;&gt;&gt;&gt; Brent Royal-Gordon<br>
&gt;&gt;&gt;&gt; Architechies<br>
&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><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></div><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr">-Saagar Jha</div></div>