NSDictionaryOfVariableBindings swift等价?

Sta*_*org 63 ios swift

Apple文档在此处显示了UIKit参考的"创建字典"部分下的令人不安的空白区域.

有人找到了NSDictionaryOfVariableBindings宏的替代品,还是我们希望自己编写?

编辑 - 根据这个或许正确的方法是编写一个全局函数来处理这个?看起来复杂的宏完全没有了.

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)

  • 是的,但这是一种在Objective-C中编写字典的方法.有趣的是,他们只是删除了宏本身...但是留下了在Swift中定义它的注释(如果打开Swift的NSLayoutConstraint,请检查代码).我真的不喜欢两次编写我的变量名,特别是因为你可能会在键中拼错它并导致崩溃.这是一个小麻烦,但这是一个烦恼. (6认同)
  • 根据XCode 6 beta 2发行说明,Dictionary尚未与NSDictionary联系.在此之前,您可能希望使用这些值显式创建NSDictionary或NSMutable字典.使用本机Swift字典作为constraintsWithVisualFormat的参数:options:metrics:views:当前导致崩溃. (3认同)
  • @ JohnM.P.Knox这不是字典被桥接到NSDictionary的问题.它已经过桥了; 当然它是桥接的!传递一个原生的Swift词典在这里工作得很好.那不是问题.问题是有_no宏_并且你不能"内省"变量名,因此不能有"NSDictionaryOfVariableBindings"的等价物. (3认同)
  • @Stakenborg他们没有"移除宏但留下评论".没有Swift标题!您正在查看Objective-C标头(通过自发生成的转换到Swift中).宏没有被翻译,因为Swift中没有宏. (2认同)

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中或多或少地编写相同的函数.这只是你没有打扰因为宏已经存在!

  • @Maverick呃,没有.没有人会说`NSLayoutFormatOptions(rawValue:0)`.你只需要在Swift 2中说`options:[]`. (3认同)

Ana*_*ile 2

该功能基于宏扩展,目前 Swift 不支持宏扩展。

我认为目前 Swift 中没有任何方法可以做类似的事情。我相信你无法编写自己的替代品。

恐怕您必须手动展开字典定义,即使这意味着每个名称重复两次。