如何在 swift 中为 @dynamicMemberLookup 中的 `subscript(dynamicMember:)` 声明“抛出”?

问题描述 投票:0回答:2

在 swift 中使用 @dynamicMemberLookup 时,

subscript
无法声明“抛出”。

subscript(dynamicMember member: String) -> Any

这样就可以了。

subscript(dynamicMember member: String) throws -> Any

这会产生编译错误。

swift subscript throws
2个回答
8
投票

目前该语言不支持在

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()

0
投票

由于 Swift 还不支持 throws 下标,所以可以使用结果类型来传递错误值。即转换:

subscript(dynamicMember member: String) throws -> Any

subscript(dynamicMember member: String) -> Result<Any, Error>
© www.soinside.com 2019 - 2024. All rights reserved.