2016-10-03 6 views
1

Я конвертирую некоторый код библиотеки в свое приложение, и я не могу понять, как преобразовать этот файл из Swift 2.3 в Swift 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 
} 

Вот где говорится «не в состоянии вывести тип закрытия в текущем контексте»

ответ

2

мне удалось решить эту проблему, явно давая укупорочное тип, что функция хочет.

func >>- <T:UIView> (lhs: (T,T), attributes: [NSLayoutAttribute]){ 
    for attribute in attributes{ 

     let closure: (inout Constraint) ->() = { 
      $0.attribute = attribute 
     } 

     lhs >>- closure 
    } 
} 

Я не уверен, почему он требует, чтобы я прямо заявил об этом, но это работает.