iOS 15 中的新功能,我们可以像这样形成一个 Swift AttributedString:
var att = AttributedString("Howdy")
att.font = UIFont(name:"Arial-BoldMT", size:15)
att.foregroundColor = UIColor(red:0.251, green:0.000, blue:0.502, alpha:1)
print(att)
很酷,但还有另一种方法。代替连续的命令式属性设置,我们可以通过 AttributeContainer 制作属性字典,将修饰函数链接到 AttributeContainer 以形成字典:
let att2 = AttributedString("Howdy",
attributes: AttributeContainer()
.font(UIFont(name:"Arial-BoldMT", size:15)!)
.foregroundColor(UIColor(red:0.251, green:0.000, blue:0.502, alpha:1))
)
print(att2)
(在现实生活中,我会说.init()
而不是AttributeContainer()
。)
所以我的问题是,这在语法上是如何工作的?我们这里似乎有一个 DSL,我们可以在其中根据属性键的名称链接看起来像函数调用的东西。在幕后,似乎有一些动态成员查找的组合,callAsFunction
也许还有某种中间构建器对象。我可以看到每个callAsFunction
调用都返回 AttributeContainer,这显然是链接的工作方式。但是,我们将如何编写我们自己的对象,使其在语法上的行为方式与 AttributeContainer 的行为方式相同?