下面的代码:
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
已经是可选的。
4条答案
按热度按时间new9mtju1#
在google上搜索了很长时间后,我终于找到了一个优雅的方法来实现这一点,可以用类型约束来编写类扩展。
第一个
将根据T是否为可选的来调用适当的方法。
3z6pesqy2#
我用一个讨厌的变通方法解决了这个问题。我抛出一个nil返回类型的异常。然后在通用函数运算符中,我捕获该特定异常,如果
T
是NilLiteralConvertible
,则返回nil
。否则,我就正常执行。kuuvgm7e3#
以下代码将
Any?
转换为T
,仅当T
是可选的并且from
是nil
时返回nil
。如果from
无法转换为T
,则该代码将崩溃。ljo96ir54#
这在Swift 3.1中起作用。修改用户3763801的答案。