> On Oct 1, 2017, at 2:32 PM, Glenn L. Austin <gl...@austinsoft.com> wrote: > >> >> On Oct 1, 2017, at 8:56 AM, Dave Reed via swift-users >> <swift-users@swift.org> wrote: >> >> >>> On Sep 21, 2017, at 3:58 PM, V T via swift-users <swift-users@swift.org> >>> wrote: >>> >>> Hi there! >>> >>> Is there a best way to check if a given type conforms to numeric protocol >>> (Integer or FP) at runtime? >>> >>> func checkNumeric<T>(_ value: T) { >>> /* return true if vaiue is Integer or FP */ >>> /* this will not compile: */ >>> if value is Numeric { >>> >>> } >>> } >>> >>> Best regards! >>> >>> VT >>> >> >> I think the way to do it is to try casting as the type, but you can't use >> "as? Numeric" as you get: >> >> error: protocol 'Numeric' can only be used as a generic constraint because >> it has Self or associated type requirements >> >> but you could check for each specific numeric type such as: >> >> func checkNumeric<T>(_ value: T) { >> if (value as? Int != nil) || (value as? Float != nil) { >> print("numeric") >> } else { >> print("not numeric") >> } >> } >> >> checkNumeric(3) >> checkNumeric(3.0) >> checkNumeric("3") > > You can also use the 'is' operator, as in 'value is Int || value is Float || > value is Double' > > -- > Glenn L. Austin, Computer Wizard, AustinSoft.com
Ah, I had forgotten "is" works in Swift Just be careful as: func checkNumeric<T>(_ value: T) { if (value is Int) || (value is Float) { print("numeric") } else { print("not numeric") } } checkNumeric(3) checkNumeric(3.0) checkNumeric("3") outputs: numeric not numeric not numeric 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). Dave _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users