![](/img/trans.png)
[英]Swift || Returning a class that can be used by other methods from an API call
[英]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.