2016-08-29 40 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 
} 

今、演算子を使用すると、私は理解していないエラーを取得していますジェネリックでない関数でもテストされていますが、ブロックの型についてはまだ不満があります。

P .:私はコードの元の著者ではなく、私はPRのコードを更新しようとしており、構文を変更するとコードに多大な影響を与えます。

+0

あなたは[mcve]を投稿できますか – Hamish

+0

これはあまりコードではないので、どこでも簡単に確認できます。私は十分な証拠を提供したと思った。他に何か要りますか? –

+0

私はXcode 8 beta 6でこれを再現しようとしました。(これは、あなたが参照しているGitHubプロジェクトです(これは(https://github.com/Ramotion/paper-onboarding)ですか?コンパイルの例については、[this gist](https://gist.github.com/hamishknight/e44bd25823d24dea068e0498fa1cef4b)を参照してください。おそらく、あなたのビルドフォルダをクリーニングしようとしますか? – Hamish

答えて

0

オペレータに渡されたコードブロックの最後にreturnコールを追加することで、この問題を解決できました。 Swift 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コールを追加すると、問題が解決されました。

興味のある開発者との理由とより良い解決策についてお話したいと思います。

関連する問題