2016-08-29 3 views
0

Xcode 7에서 8로 프로젝트를 업데이트하는 과정에서 문제가 발생합니다.Swift 3 일반 삽입 연산자 오류

UIView에 제약 조건을 처리하는 일반 infix 연산자가 있습니다. 내가 가진

for attribute: NSLayoutAttribute in [.left, .right, .top, .bottom] { 
     (view, self) >>>- { 
     $0.attribute = attribute 
     } 
    } 

infix operator error

: 연산자를 사용하여시, 내가 이해하지 못하는 오류를 받고 있어요, 지금

precedencegroup constPrecedence { 
    associativity: left 
    higherThan: AssignmentPrecedence 
} 

infix operator >>>- : constPrecedence 

@discardableResult 
func >>>- <T: UIView> (left: (T, T), block: (inout ConstraintInfo) ->()) -> NSLayoutConstraint { 
    var info = ConstraintInfo() 
    block(&info) 
    info.secondAttribute = info.secondAttribute == .notAnAttribute ? info.attribute : info.secondAttribute 

    let constraint = NSLayoutConstraint(item: left.1, 
             attribute: info.attribute, 
             relatedBy: info.relation, 
             toItem: left.0, 
             attribute: info.secondAttribute, 
             multiplier: 1, 
             constant: info.constant) 
    constraint.identifier = info.identifier 
    left.0.addConstraint(constraint) 
    return constraint 
} 

: 여기

는 운영자의 정의입니다 비 제네릭 함수로도 테스트되었지만 여전히 블록 유형에 대해 불평 할 것입니다.

아이디어가 있으십니까?

추신 : 나는 코드 작성자가 아니기 때문에 PR 코드를 업데이트하고 구문을 변경하면 코드가 너무 많이 영향을받습니다.

+0

[mcve]를 게시 할 수 있습니다. – Hamish

+0

코드가 너무 많지 않으므로 어디서든 쉽게 확인할 수 있습니다. 나는 충분한 증거를 제공했다고 생각했다. 그 밖의 무엇이 필요합니까? –

+0

Xcode 8 베타 6에서 이미이 문제를 재현 해 보았습니다. ([this] (https://github.com/Ramotion/paper-onboarding)이 당신이 말하는 GitHub 프로젝트입니까?). 컴파일 예제는 [this gist] (https://gist.github.com/hamishknight/e44bd25823d24dea068e0498fa1cef4b)를 참조하십시오. 아마도 빌드 폴더를 청소 해보십시오. – Hamish

답변

0

나는 연산자에 전달 된 코드 블록의 끝에 return 호출을 추가하여이 문제를 해결할 수있었습니다. 그것은 스위프트 3.0 컴파일러가 return없이 클로저로 코드 블록을 추론 할 수없는 것 같습니다. 질문에서 언급했듯이, 원래 운영자는 새로운 Swift 3.0 프로젝트로 잘 작동해야하지만 이전 Swift 버전에서 프로젝트를 변환하는 것은 어떻게 든 운영자를 파산시키는 것처럼 보입니다.

이 이제 운영자의 올바른 사용을하고 잘 작동 어떤 방법 :

for attribute: NSLayoutAttribute in [.left, .right, .top, .bottom] { 
     (view, self) >>>- { 
     $0.attribute = attribute 
     return 
     } 
    } 

PS : 나는 전에이 수정을하고있다하지만 난 '오류의 몇 된 후 이상한 Segmentation Fault error 11을 얻고 있었다 고정되어 있었고 그 이유를 알지 못했습니다. Xcode가 클로저 유형 중 일부를 처리하지 못했고 세그먼테이션 오류가 발생했음을 알았습니다. 연산자를 사용하고 있던 모든 장소에 return 전화를 추가하면 문제가 해결되었습니다.

관심있는 개발자와 함께 그 이유와 더 나은 해결책에 대해 기꺼이상의 해 드리겠습니다.