<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class="">Hi,&nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class="">I would like to propose changing unicodescalar initializer to failable.&nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class="">Currently, when you pass an invalid value to the UnicodeScalar initializer the swift stdlib crashes the program by calling _precondition. This is bad if you construct a unicode scalar from unknown input.</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class="">As a result. I would like to propose to mark the initializer as failable and return nil in case of a failure.&nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class=""><br class=""></font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class="">Currently, in the code below, the stdlib crashes the program by calling _precondition if codepoint is not a valid unicode. &nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="font-family: Times; font-size: small; white-space: pre-wrap;" class="">var string = “"&nbsp;</span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">let codepoint: UInt32 = 55357 // this is invalid&nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">let ucode = UnicodeScalar(codepoint) // Program crashes at this point.&nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">string.append(code)   &nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class=""><br class=""></font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class="">After marking the initializer as failable, users can write code like this. And the program will execute fine even codepoint is invalid. &nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">var string = "" let codepoint: UInt32 = 55357 // this is invalid</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">let ucode = UnicodeScalar(codepoint)&nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">if ucode != nil {   &nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">  string.append(code!)</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">} else {   &nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">  // do something else&nbsp;</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class="">}</font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap;" class=""><font face="Times" size="2" class=""><br class=""></font></span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class="">As the initializer is now failable, it returns an optional, so optional unchaining or forced unwrapping needs to be used.  Alternatively, its also possible to leave status quo and force the users to do input </font></span><span style="font-family: Times; font-size: 14px; white-space: pre-wrap;" class="">checks</span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="font-family: Times; font-size: 14px; white-space: pre-wrap;" class="">before trying to construct a UnicodeScalar. &nbsp;But i feel having failable initializer helps user to write more robust code.</span></pre><pre style="font-variant-ligatures: normal; font-variant-position: normal; font-variant-numeric: normal; font-variant-alternates: normal; font-variant-east-asian: normal; line-height: normal; widows: 1;" class=""><span style="white-space: pre-wrap; font-size: 14px;" class=""><font face="Times" class="">-Xin  </font></span></pre></body></html>