【问题标题】:Converting a file to Swift 3: unable to infer closure type in the current context将文件转换为 Swift 3:无法在当前上下文中推断闭包类型
【发布时间】:2017-02-11 01:54:59
【问题描述】:

我正在我的应用程序中转换一些库代码,但我不知道如何将此文件从 Swift 2.3 转换为 Swift 3

import UIKit

struct Constraint{
    var identifier: String?

    var attribute: NSLayoutAttribute = .centerX
    var secondAttribute: NSLayoutAttribute = .notAnAttribute
    var constant: CGFloat = 0
    var multiplier: CGFloat = 1
    var relation: NSLayoutRelation = .equal
}

func attributes(attrs:NSLayoutAttribute...) -> [NSLayoutAttribute]{
    return attrs
}

infix operator >>- : MultiplicationPrecedence

func >>- <T: UIView> (lhs: (T,T), apply: (inout Constraint) -> () ) -> NSLayoutConstraint {
    var const = Constraint()
    apply(&const)

    const.secondAttribute = .notAnAttribute == const.secondAttribute ? const.attribute : const.secondAttribute

    let constraint = NSLayoutConstraint(item: lhs.0,
                                        attribute: const.attribute,
                                        relatedBy: const.relation,
                                        toItem: lhs.1,
                                        attribute: const.secondAttribute,
                                        multiplier: const.multiplier,
                                        constant: const.constant)

    constraint.identifier = const.identifier

    NSLayoutConstraint.activate([constraint])
    return constraint
}

func >>- <T: UIView> (lhs: T, apply: (inout Constraint) -> () ) -> NSLayoutConstraint {
    var const = Constraint()
    apply(&const)

    let constraint = NSLayoutConstraint(item: lhs,
                                        attribute: const.attribute,
                                        relatedBy: const.relation,
                                        toItem: nil,
                                        attribute: const.attribute,
                                        multiplier: const.multiplier,
                                        constant: const.constant)
    constraint.identifier = const.identifier

    NSLayoutConstraint.activate([constraint])
    return constraint
}

func >>- <T:UIView> (lhs: (T,T),attributes: [NSLayoutAttribute]){
    for attribute in attributes{
        lhs >>- {
            $0.attribute = attribute
        }
    }
}

func >>- <T:UIView> (lhs: T, attributes: [NSLayoutAttribute]){
    for attribute in attributes{
        lhs >>- {
            $0.attribute = attribute
        }
    }
}

错误在最后两个函数中。

lhs >>- {
    $0.attribute = attribute
}

这里是“无法在当前上下文中推断闭包类型”的地方

【问题讨论】:

    标签: ios swift swift3 infix-notation


    【解决方案1】:

    我设法通过明确地给闭包函数想要的类型来解决这个问题。

    func >>- <T:UIView> (lhs: (T,T), attributes: [NSLayoutAttribute]){
        for attribute in attributes{
    
            let closure: (inout Constraint) -> () = {
                $0.attribute = attribute
            }
    
            lhs >>- closure
        }
    }
    

    我不知道为什么它需要我明确说明,但这最终会奏效。

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 2019-04-05
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多