jhi*_*erd 58
根据Apple源代码:
NSDictionaryOfVariableBindings(v1,v2,v3)相当于[NSDictionary dictionaryWithObjectsAndKeys:v1,@"v1",v2,@"v2",v3,@"v3",nil];
所以在Swift中你可以使用以下方法:
let bindings = ["v1": v1, "v2": v2, "v3": v3]
Run Code Online (Sandbox Code Playgroud)
mat*_*att 28
NSDictionaryOfVariableBindings就像你说的那样,是一个宏.Swift中没有宏.这么多.
尽管如此,您可以轻松编写Swift函数,为字符串中的视图指定字符串名称,然后将该字典传递给constraintsWithVisualFormat.不同之处在于,与Objective-C不同,Swift无法看到这些视图的名称; 你必须让它组成一些新的名字.
[要明确的是,并非您的Objective-C 代码可以看到您的变量名称; 就是说,在宏观评估时,预处理器在源代码上运行文本并重写它 - 所以它可以只使用变量名的文本在引号内(用于制作字符串)和在外部(用于制作值)形成一本字典.但是使用Swift,没有预处理器.]
所以,这就是我的工作:
func dictionaryOfNames(arr:UIView...) -> Dictionary<String,UIView> {
var d = Dictionary<String,UIView>()
for (ix,v) in arr.enumerate(){
d["v\(ix+1)"] = v
}
return d
}
Run Code Online (Sandbox Code Playgroud)
你打电话给它并像这样使用它:
let d = dictionaryOfNames(myView, myOtherView, myFantasicView)
myView.addConstraints(
NSLayoutConstraint.constraintsWithVisualFormat(
"H:|[v2]|", options: nil, metrics: nil, views: d)
)
Run Code Online (Sandbox Code Playgroud)
问题在于,您需要了解myOtherView可视格式字符串中的名称v2(因为它是传入的列表中的第二个dictionaryOfNames()).但我可以忍受这一点,只是为了避免每次手工输入字典的单调乏味.
当然,您也可以在Objective-C中或多或少地编写相同的函数.这只是你没有打扰因为宏已经存在!
该功能基于宏扩展,目前 Swift 不支持宏扩展。
我认为目前 Swift 中没有任何方法可以做类似的事情。我相信你无法编写自己的替代品。
恐怕您必须手动展开字典定义,即使这意味着每个名称重复两次。
| 归档时间: |
|
| 查看次数: |
17161 次 |
| 最近记录: |