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

lea*_*vez 7 subscript throws swift

在 swift 中使用 @dynamicMemberLookup 时,subscript无法声明“抛出”。

subscript(dynamicMember member: String) -> Any
Run Code Online (Sandbox Code Playgroud)

还行吧。

subscript(dynamicMember member: String) throws -> Any
Run Code Online (Sandbox Code Playgroud)

这会产生编译错误。

lea*_*vez 8

该语言目前不支持使用throwsin 。subscript但是,您可以使用一些技巧来避免这种情况,同时保留以下功能throws

public subscript(dynamicMember member: String) -> () throws -> Any {
    return { try REAL_FUNCTION_THAT_THROWS()  }
}
Run Code Online (Sandbox Code Playgroud)

只需声明订阅返回一个块,然后()在函数后面添加一个即可执行真正的函数。所以你可以这样编码:

@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()
Run Code Online (Sandbox Code Playgroud)