2016-12-29 5 views
0

を発生させ、私はそうのような心の中でインデックスを超えるループのためのArrayインスタンスの拡張子を持つ:スウィフトアレイ閉鎖拡張子はエラー

extension Array { 
    func fun (_ iterator: (Int, Element) -> Void) -> Void { 
     for (key,value) in self.enumerated() { 
      iterator(key,value) 
     } 
    } 
} 

は今、私はそれを呼びたい:

[.leading,.trailing,.bottom,.top].fun { 
    (index, element) in 

    var c : Int = index % 2 == 0 ? 20 : -20 // THAT LINE 
    NSLayoutConstraint(item: subView, attribute: element, relatedBy: .equal, toItem: self.view, attribute: element , multiplier: 1, constant: c).isActive = true 
} 

しかし、エラーを引き起こす:表現のタイプは、文脈がなくてもあいまいである。 スニペットの行( "THAT LINE")を削除すると機能します。このコードや他のコード、さらには変数宣言を追加しても、同じ例外が発生します。

このエラーは、ONLY Xcodeで表示され、端末にそれが動作します:

swift 
Welcome to Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1). Type :help for assistance. 
    1> 
    2> 
    3> extension Array { 
    4.  func fun (_ iterator: (Int, Element) -> Void) -> Void { 
    5.   for (key,value) in self.enumerated() { 
    6.    iterator(key,value) 
    7.   } 
    8.  } 
    9. } 
10> [0,1,2,3,4].fun { 
11.  (index, element) in 
12. 
13.  var c : Int = index % 2 == 0 ? 20 : -20 // THAT LINE 
14.  print(c) 
15. } 
20 
-20 
20 
-20 
20 
+0

これは既知のバグ([SR-1570](https://bugs.swift.org/browse/SR-1570))が原因である可能性があります。Swiftはクロージャのパラメータタイプを推論できません外部コンテキストなしで複数のステートメントを閉じて 'fun'を呼び出すとき)。明示的にパラメータ型を指定すると、サンプルがコンパイルされます。 "その行"を削除すると、指定されたクロージャは複数のステートメントクロージャではなくなりました。しかし、あなたの2番目の例は私のためにうまくコンパイルされます。 – dfri

+0

ありがとうdfri、それが原因です(完全なパラメータ型の推論) –

答えて

0

は、配列要素の問題のタイプのように思えます。

[.leading,.trailing,.bottom,.top]の代わりに[NSLayoutAttribute.leading, NSLayoutAttribute.trailing, NSLayoutAttribute.bottom, NSLayoutAttribute.top]を試してください。

constant: cの代わりにconstant: CGFloat(c)です。