在 swift 中使用 @dynamicMemberLookup 时,
subscript
无法声明“抛出”。
subscript(dynamicMember member: String) -> Any
这样就可以了。
subscript(dynamicMember member: String) throws -> Any
这会产生编译错误。
目前该语言不支持在
throws
中使用 subscript
。不过你可以使用一些技巧来避免这种情况,同时保留throws
的特征:
public subscript(dynamicMember member: String) -> () throws -> Any {
return { try REAL_FUNCTION_THAT_THROWS() }
}
只需声明订阅返回一个块,然后在函数后面添加一个
()
即可执行真正的函数。所以你可以这样编码:
@dynamicMemberLookup
class A {
public subscript(dynamicMember member: String) -> () throws -> Any {
return { try REAL_FUNCTION_THAT_THROWS() }
}
}
let a = A()
let value = try? a.doWhatYouWant()
let value2 = try? a.anotherMethod()
由于 Swift 还不支持 throws 下标,所以可以使用结果类型来传递错误值。即转换:
subscript(dynamicMember member: String) throws -> Any
到
subscript(dynamicMember member: String) -> Result<Any, Error>