2016-05-30 6 views
1

このコードで何が問題になっていますか? REPLとコンパイラ(セグメンテーションフォールト11)の両方がクラッシュします... これは簡単なジェネリックスの例であると考えられています。クラッシュは、ArrayLiteralConvertibleの適合性を追加する拡張機能のために見えます。基本型Listはそれ自身でうまく動作します。迅速なクラッシュ(ジェネリックに関連する?)

struct List<Item> { 

    private var items: [Item] = [] 

    var count: Int { 
     return items.count 
    } 

    func item(atIndex index: Int) -> Item? { 
     if index < count { 
      return items[index] 
     } else { 
      return nil 
     } 
    } 

    mutating func add(item: Item) { 
     items.append(item) 
    } 

    mutating func remove(atIndex index: Int) { 
     if index < count { 
      items.removeAtIndex(index) 
     } 
    } 
} 

extension List: ArrayLiteralConvertible { 

    typealias Element = Item 

    init(arrayLiteral elements: Item...) { 
     items = elements 
    } 
} 

var numbers: List<Int> = [1, 2, 3] 
+0

合意して、私は拡張が問題だと思います。 ArrayLiteralConvertibleの適合性をメインの構造体定義に移動すると、動作するようです。 – jtbandes

答えて

2

これはすでに回避策としてhttps://bugs.swift.org/browse/SR-493

に提出されたバグ、のようです、あなたはクラッシュを避けるように見えるメインの構造体の定義の中にinit(arrayLiteral:)ArrayLiteralConvertible準拠を移動することができます。

+0

チップをありがとう。教授の目的のために、私はプロトコルの適合性をエクステンションに入れなければならなかった。バグレポートで言及された回避策は機能しますが、私の例では別の回避策が必要です。 –