<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-family:arial,sans-serif;font-size:13px">But for something to be StringLiteralConvertible, it needs to be ExtendedGraphemeClusterLiteral</span><span style="font-family:arial,sans-serif;font-size:13px">Convertible and UnicodeScalarLiteralConvertibl</span><span style="font-family:arial,sans-serif;font-size:13px">e, which means I have to define two initializers that will never be called.</span></blockquote><div><br></div><div><div class="gmail_default" style="display:inline">Yes. Because </div><div class="gmail_default" style="font-family:georgia,serif;display:inline">​StringLiteralConvertible inherits from ExtendedGraphemeClusterLiteralConvertible, ExtendedGraphemeClusterLiteralConvertible inherits from </div><font face="georgia, serif">UnicodeScalarLiteralConvertible.<div class="gmail_default" style="font-family:georgia,serif;display:inline">​</div></font></div><div><font face="georgia, serif"><div class="gmail_default" style="font-family:georgia,serif;display:inline"><br></div></font></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-size:13px">Is there a way to write something that is a unicode scalar literal, but not a string literal?</span></blockquote><div class="gmail_default"><font face="georgia, serif">​Yes. You have already done it by ​extension </font><span style="font-family:georgia,serif">UnicodeScalarLiteralConvertible only. String literal is what people read. Unicode is something string encoding to store in computer and the computer read.</span></div><div class="gmail_default"><span style="font-family:georgia,serif"><br></span></div><div class="gmail_default"><span style="font-family:georgia,serif">for example:</span></div><div class="gmail_default"><span style="font-family:georgia,serif"><br></span></div><div class="gmail_default"><div class="gmail_default"><font face="georgia, serif">let uScalar = &quot;a&quot;.unicodeScalars.first! // 97</font></div><div class="gmail_default"><font face="georgia, serif">print(uScalar.dynamicType) // UnicodeScalar. NOT an Int</font></div></div><div class="gmail_default"><span style="font-family:georgia,serif"><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 11, 2016 at 4:54 AM, Loïc Lecrenier <span dir="ltr">&lt;<a href="mailto:swift-users@swift.org" target="_blank">swift-users@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi :)<br>
<br>
I have been trying to understand the StringLiteralConvertible protocol, but there is something that I still can’t explain.<br>
<br>
//-----------------------------<br>
<br>
extension Int : UnicodeScalarLiteralConvertible {<br>
    public init(unicodeScalarLiteral value: UnicodeScalar) {<br>
        self = 1<br>
    }<br>
}<br>
<br>
extension Int : ExtendedGraphemeClusterLiteralConvertible {<br>
    public init(extendedGraphemeClusterLiteral value: Character) {<br>
        self = 2<br>
    }<br>
}<br>
<br>
extension Int : StringLiteralConvertible {<br>
    public init(stringLiteral value: String) {<br>
        self = 3<br>
    }<br>
}<br>
<br>
let a : Int = &quot;\u{65}&quot; // e<br>
let b : Int = &quot;\u{65}\u{0301}&quot; // é<br>
let c : Int = “hello&quot;<br>
<br>
//-----------------------------<br>
<br>
If I only write the first extension: I can only initialize a, and its value will be 1.<br>
If I write the first two extensions: I can initialize a and b, and their values will be 2.<br>
And if I keep the three extensions: a, b, and c will all have a value of 3.<br>
<br>
So it seems like the compiler prefers calling the initializer from (in order of preference):<br>
1. StringLiteralConvertible<br>
2. ExtendedGraphemeClusterLiteralConvertible<br>
3. UnicodeScalarLiteralConvertible<br>
<br>
But for something to be StringLiteralConvertible, it needs to be ExtendedGraphemeClusterLiteralConvertible and UnicodeScalarLiteralConvertible, which means I have to define two initializers that will never be called.<br>
<br>
Is that correct?<br>
Is there a way to write something that is a unicode scalar literal, but not a string literal?<br>
<br>
Thank you,<br>
<br>
Loïc<br>
<br>
<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
swift-users mailing list<br>
<a href="mailto:swift-users@swift.org">swift-users@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-users" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-users</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><br>Owen Zhao<br></div></div></div>
</div>