Search code examples
swiftoption-type

How can you check if a type is Optional in Swift?


How can you check if a type is Optional in Swift?

Say I have a variable of type PartialKeyPath where:

struct Foo {
    let bar: String
    let baz: String?
}

typealias Property<Root> = (key: PartialKeyPath<Root>, value: Any?)
typealias Properties<Root> = [Property<Root>]

Now say I iterate thru an instance of Properties:

properties.forEach { prop in
    let valueType1 = type(of: prop.key).valueType
    let valueType2 = type(of: value)

    ...

How can I check here whether valueType1 is Optional<valueType2>, or whether it is Optional of any other flavor for that matter?

So far the only way I’ve found is really ugly...


Solution

  • This is a hacky but working solution:

    func isOptional(_ type: Any.Type) -> Bool {
        let typeName = String(describing: type)
        return typeName.hasPrefix("Optional<")
    }
    

    Test:

    let t1 = Int?.self
    let t2 = Bool.self
    
    print(isOptional(t1))
    // true
    
    print(isOptional(t2))
    // false