swift2 对于泛型类型,返回Nil

4nkexdtk  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(202)

下面的代码:

class Function<T> {
    var ptr: () throws -> T

    init<Func>(block: Func, args: AnyObject...) {
        self.ptr = {() throws -> T in
            let result: AnyObject? = nil

            if T.self == Void.self {
                return Void() as! T
            }

            return result //Error Here.. Cannot as! cast it either.. Cannot unsafeBitCast it either..
        }
    }
}

postfix operator ^ { }
postfix func ^ <T>(left: Function<T>) throws -> T {
    return try left.ptr()
}

func call() {
    let block: (String) -> String? = {(arg) -> String? in
        return nil
    }

    let fun = Function<String?>(block: block, args: "Hello")
    fun^
}

函数Block.execute返回AnyObject?。我的泛型类Function<T>需要T的返回类型。
如果T已经是String?,为什么我不能返回nil?
有没有办法将nil作为类型T返回,而T已经是可选的?
如果我把T设为可选,那么返回类型就变成了Optional<Optional<String>>,这不是我想要的......那么编译器就会抱怨OptionalOptional没有用??展开。这就是我如何知道T已经是可选的。

new9mtju

new9mtju1#

在google上搜索了很长时间后,我终于找到了一个优雅的方法来实现这一点,可以用类型约束来编写类扩展。
第一个
将根据T是否为可选的来调用适当的方法。

3z6pesqy

3z6pesqy2#

我用一个讨厌的变通方法解决了这个问题。我抛出一个nil返回类型的异常。然后在通用函数运算符中,我捕获该特定异常,如果TNilLiteralConvertible,则返回nil。否则,我就正常执行。

class Function<T> {
    var ptr: () throws -> T

    init<Func>(block: Func, args: AnyObject...) {
        self.ptr = {() throws -> T in
            let result: AnyObject? = execute(block, args...)

            if T.self == Void.self {
                return Void() as! T
            }

            throw BlockError.BlockReturnsNil
        }
    }
}

postfix func ^ <T>(left: Function<T>) throws -> T {
    return try left.ptr()
}

postfix func ^ <T : NilLiteralConvertible>(left: Function<T>) throws -> T {
    do {
        return try left.ptr() 
    }
    catch BlockError.BlockReturnsNil {
        return nil
    }
}
kuuvgm7e

kuuvgm7e3#

以下代码将Any?转换为T,仅当T是可选的并且fromnil时返回nil。如果from无法转换为T,则该代码将崩溃。

func cast<T>(from v: Any?)->T {        
    return v as! T
}

func cast<T>(from v: Any?)->T where T: ExpressibleByNilLiteral {
    guard let v = v else { return nil }
    return v as! T
}
ljo96ir5

ljo96ir54#

这在Swift 3.1中起作用。修改用户3763801的答案。

func cast<T>(_ v: Any) -> T {
    return v as! T
}

相关问题