【问题标题】:How to declare "throws" for `subscript(dynamicMember:)`in @dynamicMemberLookup in swift?如何在swift中的@dynamicMemberLookup中为`subscript(dynamicMember :)`声明“抛出”?
【发布时间】:2019-04-18 21:37:23
【问题描述】:

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

subscript(dynamicMember member: String) -> Any

没关系。

subscript(dynamicMember member: String) throws -> Any

这会产生编译错误。

【问题讨论】:

  • Swift 通常还不支持抛出下标或计算属性。以下是讨论此类声明的语义的相关主题:forums.swift.org/t/…

标签: swift subscript throws


【解决方案1】:

目前该语言不支持在 subscript 中使用 throws。但是你可以使用一些技巧来避免这种情况,同时保留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()

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-27
    • 2013-03-28
    • 2021-04-20
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多