DynamicArray
現在、Swift で独自のデータ型を実装しようとしています。そのために、ポインターを少し使用しています。私のように、私はジェネリック型のroot
を使用しています:UnsafeMutablePointer
T
struct DynamicArray<T> {
private var root: UnsafeMutablePointer<T> = nil
private var capacity = 0 {
didSet {
//...
}
}
//...
init(capacity: Int) {
root = UnsafeMutablePointer<T>.alloc(capacity)
self.capacity = capacity
}
init(count: Int, repeatedValue: T) {
self.init(capacity: count)
for index in 0..<count {
(root + index).memory = repeatedValue
}
self.count = count
}
//...
}
ご覧のとおり、capacity
現在割り当てられているメモリの量を示すプロパティも実装しましたroot
。したがって、適切な量のメモリを割り当て、プロパティを設定するイニシャライザをDynamicArray
使用してインスタンスを作成できます。
しかし、その後、イニシャライザも実装しました。これは、最初に を使用して必要なメモリを割り当てます。次に、メモリのその部分の各セグメントを に設定します。init(capacity:)
capacity
init(count:repeatedValue:)
init(capacity: count)
repeatedValue
、、またはinit(count:repeatedValue:)
などの数値型で初期化子を使用すると、完全に正常に機能します。次に、を使用するか、クラッシュしますが。ただし、一貫してクラッシュするわけではありませんが、ここで見られるように、数回コンパイルすることで実際に機能することがあります。Int
Double
Float
Character
String
var a = DynamicArray<Character>(count: 5, repeatedValue: "A")
println(a.description) //prints [A, A, A, A, A]
//crashes most of the time
var b = DynamicArray<Int>(count: 5, repeatedValue: 1)
println(a.description) //prints [1, 1, 1, 1, 1]
//works consistently
なぜこうなった?異なる長さの値を保持する必要がString
ありますか?Character
更新 #1:
今@AirspeedVelocityは問題に対処しましたinit(count:repeatedValue:)
. ただし、 には別のDynamicArray
イニシャライザが含まれており、最初は と同様の方法で機能しましたinit(count:repeatedValue:)
。@AirspeedVelocity で説明されているように、動作するように変更しましinit(count:repeatedValue:)
た。
init<C: CollectionType where C.Generator.Element == T, C.Index.Distance == Int>(collection: C) {
let collectionCount = countElements(collection)
self.init(capacity: collectionCount)
root.initializeFrom(collection)
count = collectionCount
}
here でinitializeFrom(source:)
説明されている方法を使用しています。それに準拠しているため、正常に動作するはずです。
私は今、このエラーが発生しています:collection
CollectionType
<stdin>:144:29: error: missing argument for parameter 'count' in call
root.initializeFrom(collection)
^
これも誤解を招くエラー メッセージですか?