<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;
      charset=windows-1252">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Scratch that, that won't work for the runtime type:</p>
    <p>isNumeric(0 as Any) == false // :(<br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 10/4/2017 9:30 PM, Kevin Lundberg
      via swift-users wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:168e4192-674e-b43a-c0df-14026151e8c0@klundberg.com">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <p>Can you do something like this?</p>
      <p>func isNumber&lt;T: Numeric&gt;(_ value: T) -&gt; Bool { return
        true }</p>
      <p>func isNumber&lt;T&gt;(_ value: T) -&gt; Bool { return false }</p>
      <p>I don't recall whether or not swift will pick the right version
        of the function here, or whether this can even compile (mac isnt
        open at the moment), but if you can overload functions in this
        way then it might be much nicer than checking for lots of
        concrete types.<br>
      </p>
      <br>
      <div class="moz-cite-prefix">On 10/1/2017 6:27 PM, V T via
        swift-users wrote:<br>
      </div>
      <blockquote type="cite"
        cite="mid:8E8A3D8A-560B-4207-B3E0-0807C8C77197@mailbox.org">
        <meta http-equiv="Content-Type" content="text/html;
          charset=windows-1252">
        <br class="">
        <div><br class="">
          <blockquote type="cite" class="">
            <div class="">On 1. Oct 2017, at 22:43, <a
                href="mailto:davelist@mac.com" class=""
                moz-do-not-send="true">davelist@mac.com</a> wrote:</div>
            <br class="Apple-interchange-newline">
            <div class="">
              <div class="">
                <div class=""><br class="">
                  <br class="">
                  <blockquote type="cite" class="">On Oct 1, 2017, at
                    2:32 PM, Glenn L. Austin &lt;<a
                      href="mailto:glenn@austinsoft.com" class=""
                      moz-do-not-send="true">glenn@austinsoft.com</a>&gt;
                    wrote:<br class="">
                    <br class="">
                    <blockquote type="cite" class=""><br class="">
                      On Oct 1, 2017, at 8:56 AM, Dave Reed via
                      swift-users &lt;<a
                        href="mailto:swift-users@swift.org" class=""
                        moz-do-not-send="true">swift-users@swift.org</a>&gt;
                      wrote:<br class="">
                      <br class="">
                      <br class="">
                      <blockquote type="cite" class="">On Sep 21, 2017,
                        at 3:58 PM, V T via swift-users &lt;<a
                          href="mailto:swift-users@swift.org" class=""
                          moz-do-not-send="true">swift-users@swift.org</a>&gt;
                        wrote:<br class="">
                        <br class="">
                        Hi there!<br class="">
                        <br class="">
                        Is there a best way to check if a given type
                        conforms to numeric protocol (Integer or FP) at
                        runtime?<br class="">
                        <br class="">
                        func checkNumeric&lt;T&gt;(_ value: T) {<br
                          class="">
                        <span class="Apple-tab-span" style="white-space:pre">        </span>/*
                        return true if vaiue is Integer or FP */<br
                          class="">
                        <span class="Apple-tab-span" style="white-space:pre">        </span>/*
                        this will not compile: */<br class="">
                        <span class="Apple-tab-span" style="white-space:pre">        </span>if
                        value is Numeric {<br class="">
                        <span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><br
                          class="">
                        <span class="Apple-tab-span" style="white-space:pre">        </span>}<br
                          class="">
                        }<br class="">
                        <br class="">
                        Best regards!<br class="">
                        <br class="">
                        VT<br class="">
                        <br class="">
                      </blockquote>
                      <br class="">
                      I think the way to do it is to try casting as the
                      type, but you can't use "as? Numeric" as you get:<br
                        class="">
                      <br class="">
                      error: protocol 'Numeric' can only be used as a
                      generic constraint because it has Self or
                      associated type requirements<br class="">
                      <br class="">
                      but you could check for each specific numeric type
                      such as:<br class="">
                      <br class="">
                      func checkNumeric&lt;T&gt;(_ value: T) {<br
                        class="">
                        if (value as? Int != nil) || (value as? Float !=
                      nil) {<br class="">
                            print("numeric")<br class="">
                        } else {<br class="">
                            print("not numeric")<br class="">
                        }<br class="">
                      }<br class="">
                      <br class="">
                      checkNumeric(3)<br class="">
                      checkNumeric(3.0)<br class="">
                      checkNumeric("3")<br class="">
                    </blockquote>
                    <br class="">
                    You can also use the 'is' operator, as in 'value is
                    Int || value is Float || value is Double'<br
                      class="">
                    <br class="">
                    -- <br class="">
                    Glenn L. Austin, Computer Wizard, <a
                      href="http://AustinSoft.com" class=""
                      moz-do-not-send="true">AustinSoft.com</a><br
                      class="">
                  </blockquote>
                  <br class="">
                  <br class="">
                  Ah, I had forgotten "is" works in Swift<br class="">
                  <br class="">
                  Just be careful as:<br class="">
                  <br class="">
                  func checkNumeric&lt;T&gt;(_ value: T) {<br class="">
                     if (value is Int) || (value is Float) {<br class="">
                         print("numeric")<br class="">
                     } else {<br class="">
                         print("not numeric")<br class="">
                     }<br class="">
                  }<br class="">
                  <br class="">
                </div>
              </div>
            </div>
          </blockquote>
          <div><br class="">
          </div>
          <div>Thanks all! My current implementation looks like this. A
            bit redundant, bat it works. My intention was to simplify
            that monster:</div>
          <div><br class="">
          </div>
          <div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class=""><span style="color: #95a8b6" class="">func</span>
              isNumber&lt;T&gt;(<span style="color: #95a8b6" class="">_</span>
              value: <span style="color: #a0afad" class="">T</span>)
              -&gt; <span style="color: #7b9a42" class="">Bool</span> {</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">    <span style="color: #95a8b6" class="">let</span>
              valueMirror = <span style="color: #7b9a42" class="">Mirror</span>(reflecting:
              value)</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(202, 115, 53); background-color: rgb(41, 41, 41);"
              class=""><span style="color: #f4f4f4" class="">    </span>#if<span
                style="color: #f4f4f4" class=""> </span>arch<span
                style="color: #f4f4f4" class="">(</span>arm<span
                style="color: #f4f4f4" class="">) || </span>arch<span
                style="color: #f4f4f4" class="">(</span>arm64<span
                style="color: #f4f4f4" class="">)</span></div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">        <span style="color: #95a8b6" class="">if</span>
              (valueMirror.subjectType == Int.<span style="color:
                #95a8b6" class="">self</span> || valueMirror.subjectType
              == UInt.<span style="color: #95a8b6" class="">self</span>
              || valueMirror.subjectType == Double.<span style="color:
                #95a8b6" class="">self</span> || valueMirror.subjectType
              == Int8.<span style="color: #95a8b6" class="">self</span>
              || valueMirror.subjectType == Int16.<span style="color:
                #95a8b6" class="">self</span> || valueMirror.subjectType
              == Int32.<span style="color: #95a8b6" class="">self</span>
              || valueMirror.subjectType == Int64.<span style="color:
                #95a8b6" class="">self</span> || valueMirror.subjectType
              == UInt8.<span style="color: #95a8b6" class="">self</span>
              || valueMirror.subjectType == UInt16.<span style="color:
                #95a8b6" class="">self</span> || valueMirror.subjectType
              == UInt32.<span style="color: #95a8b6" class="">self</span>
              || valueMirror.subjectType == UInt64.<span style="color:
                #95a8b6" class="">self</span> || valueMirror.subjectType
              == Float.<span style="color: #95a8b6" class="">self</span>
              || valueMirror.subjectType == Float32.<span style="color:
                #95a8b6" class="">self</span> || valueMirror.subjectType
              == NSNumber.<span style="color: #95a8b6" class="">self</span>
              || valueMirror.subjectType == NSDecimalNumber.<span
                style="color: #95a8b6" class="">self</span> ) {</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">            <span style="color: #95a8b6"
                class="">return</span> <span style="color: #95a8b6"
                class="">true</span></div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">        }</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">        <span style="color: #95a8b6" class="">else</span>
              {</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">            <span style="color: #95a8b6"
                class="">return</span> <span style="color: #95a8b6"
                class="">false</span></div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">        }</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(202, 115, 53); background-color: rgb(41, 41, 41);"
              class=""><span style="color: #f4f4f4" class="">    </span>#else</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">        <span style="color: #95a8b6" class="">if</span>
              (valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Int</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">UInt</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Double</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Int8</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Int16</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Int32</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Int64</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">UInt8</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">UInt16</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">UInt32</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">UInt64</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Float</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Float32</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">Float80</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">NSNumber</span>.<span
                style="color: #95a8b6" class="">self</span> ||
              valueMirror.<span style="color: #7b9a42" class="">subjectType</span>
              == <span style="color: #7b9a42" class="">NSDecimalNumber</span>.<span
                style="color: #95a8b6" class="">self</span> ) {</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">            <span style="color: #95a8b6"
                class="">return</span> <span style="color: #95a8b6"
                class="">true</span></div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">        }</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">        <span style="color: #95a8b6" class="">else</span>
              {</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">            <span style="color: #95a8b6"
                class="">return</span> <span style="color: #95a8b6"
                class="">false</span></div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">        }</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(202, 115, 53); background-color: rgb(41, 41, 41);"
              class=""><span style="color: #f4f4f4" class="">    </span>#endif</div>
            <div style="margin: 0px; font-stretch: normal; font-size:
              14px; line-height: normal; font-family: Monaco; color:
              rgb(244, 244, 244); background-color: rgb(41, 41, 41);"
              class="">}</div>
            <div class=""><br class="">
            </div>
          </div>
          <blockquote type="cite" class="">
            <div class="">
              <div class="">
                <div class="">checkNumeric(3)<br class="">
                  checkNumeric(3.0)<br class="">
                  checkNumeric("3")<br class="">
                  <br class="">
                  outputs:<br class="">
                  <br class="">
                  numeric<br class="">
                  not numeric<br class="">
                  not numeric<br class="">
                  <br class="">
                  Since the literal 3.0 is a Double so you'd have to
                  catch every floating point type (including CGFloat, I
                  suspect etc.) vs. just trying to cast to a Float
                  (although I guess casting to a Float could have
                  unexpected results also if someone made an extension
                  that allows a type to be cast as a Float).<br class="">
                  <br class="">
                  Dave<br class="">
                  <br class="">
                  <br class="">
                </div>
              </div>
            </div>
          </blockquote>
        </div>
        <br class="">
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
        <pre wrap="">_______________________________________________

swift-users mailing list

<a class="moz-txt-link-abbreviated" href="mailto:swift-users@swift.org" moz-do-not-send="true">swift-users@swift.org</a>

<a class="moz-txt-link-freetext" href="https://lists.swift.org/mailman/listinfo/swift-users" moz-do-not-send="true">https://lists.swift.org/mailman/listinfo/swift-users</a>

</pre>
      </blockquote>
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
swift-users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:swift-users@swift.org">swift-users@swift.org</a>
<a class="moz-txt-link-freetext" href="https://lists.swift.org/mailman/listinfo/swift-users">https://lists.swift.org/mailman/listinfo/swift-users</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>