//
// DynamicFindCall.swift
// SwiftCode
//
// Created by Alisa on 2022/4/19.
// Copyright ? 2022 Alisa. All rights reserved.
//
import Foundation
/*
** 动态成员查找 @dynamicMemberLoopup
动态成员查找是swift4.2版本后增加的新特性,这个特性使得使用swfit语言在访问类、结构体或枚举等属性时,更具动态化
当一个类没有属性A时,直接对A进行访问会产生编译错误,我们可以使用 @dynamicMemberLoopup来对CustomData类进行修饰, @dynamicMemberLoopup可以为
数据结构增加动态成员查找的能力
增加了动态成员查找功能后,如果我们访问了不存在的属性,就会根据指定的属性类型调用对应的subscript方法来返回对应类型的值
** 动态方法调用 @dynamicCallable
动态方法调用与动态成员查找类似,其实swift5.0版本之后引入的特性就像不能访问不存在的属性一样,对于一般的数据类型,我们也不可以直接将其实例作为方法
进行调用,除非其支持动态方法调用
使用 @dynamicCallable可以将类型修改为支持动态方法调用
要支持动态方法调用,我们需要实现dynamicCall(withArguments:)方法与dynamicallyCall(withKeywordArguments:)方法,这两个方法的区别在于调用的
时候是直接传入一组参数还是以键值对的方式传入参数
*/
@dynamicMemberLookup
@dynamicCallable
class CustomData{
var name:String = ""
var age:Int = 0
subscript(dynamiceMember member:String) -> String{
return "unknow"
}
subscript(dynamicMember member:String) -> Int{
return 0
}
func dynamicallyCall(withArguments arg:[String]){
print("unknow func:\(arg)")
}
func dynamiccallyCall(withKeywordArguments pairs:KeyValuePairs<String, Int>){
let res = pairs.map{
key, value in return "[\(key):\(value)]"
}.joined(separator: "")
print(res)
}
}
class DynamicFindCall{
//动态成员查找
func useDynamicMemberLoopup(){
let obj = CustomData()
let num:Int = obj.num
print("num = \(num)")
/* 打印信息:
num = 0
*/
}
//动态方法调用
func useDynamicCallable(){
let obj = CustomData()
let a = "a"
let b = "b"
obj("字符串参数", a, b)
/* 打印信息:
unknow func:["字符串参数", "a", "b"]
*/
}
}
|