簡體   English   中英

@dynamicMemberLookup 可以用來調用方法嗎?

[英]Can @dynamicMemberLookup be used to call methods?

@dynamicMemberLookup的文檔中說,

將此屬性應用於 class、結構、枚舉或協議,以允許在運行時按名稱查找成員。

如果我沒記錯的話,實例方法被認為是 struct / class 的成員。但是,當我嘗試動態調用 function 時,我收到一條錯誤消息:

動態鍵路徑成員查找不能引用實例方法foo()

要重現問題:

struct Person {
    var name: String
    var age: Int
    
    func greet() {
        print("hello, my name is \(name)")
    }
}

@dynamicMemberLookup
struct Wrapper {
    var value: Person
    
    subscript<T>(dynamicMember keypath: KeyPath<Person, T>) -> T {
        value[keyPath: keypath]
    }
}

let person = Person(name: "John Doe", age: 21)
let wrapper = Wrapper(value: person)

wrapper.greet()  // << Error: Dynamic key path member lookup cannot refer to instance method `greet()`
// Or
let function = wrapper.greet  // << Error: Dynamic key path member lookup cannot refer to instance method `greet()`
function()

如何使用@dynamicMemberLookup動態調用greet() 有什么辦法可以實現我想要做的事情嗎?

提前致謝!

不, dynamicMemberLookup不適用於方法。 正如下標的簽名所暗示的那樣,它僅適用於可以表示為KeyPath的事物。 方法調用不能是關鍵路徑的一部分。 :(

鍵路徑表達式

鍵路徑表達式指的是類型的屬性或下標。

該路徑由屬性名稱、下標、可選鏈接表達式和強制展開表達式組成。 這些關鍵路徑組件中的每一個都可以根據需要以任何順序重復多次。

在編譯時,鍵路徑表達式被KeyPath class 的實例替換。

我懷疑它之所以被稱為“動態成員查找”是因為它也適用於下標。 dynamicPropertyOrSubscriptLookup的替代方案相當麻煩,不是嗎?

一個相當棘手的修復方法是將greet更改為計算屬性:

var greet: () -> Void { {
    print("hello, my name is \(name)")
} }

如果greet有參數,你也可以把它改成下標,但我認為這是一個更丑陋的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM