結論から言って、[Swift]extensionで実装するPerl風の配列操作の方が十分に実用的な記事です。
やっぱりSwift : 配列 #3 : 要素の型の混ざった配列は作れるか?には
Swiftの配列の宣言で作ったにもかかわらず、Foundationフレームワークの配列が作られていました。
とありましたが、Swiftに関するメモ その7 - 型変換 を参考に定義しなおしてみると、pure Swiftで(import Foundation
することなしに)要素の型が混ざった配列を定義することに成功しました。
なお、私の目的はそもそもperl風に配列を扱えるようにできないかどうかでしたのでPerlで頻出のpop(),push(),shift(),unshift()
のみを実装しています。splice
は標準で搭載されているようですので書いてません。
ArrayLikePerl.swift
class ArrayLikePerl {
var value: [Any] = []
init(_ array :[Any] = []){
value = array
}
func count()->Int {
return self.value.count
}
func pop() -> Any? {
if self.count() == 0 { return nil }
let removed: Any? = self.value.removeAtIndex(self.value.endIndex.predecessor())
return removed
}
func push(value: Any?...) -> Any? {
for v in value {
self.value.insert(v, atIndex: self.value.endIndex)
}
return value
}
func shift() -> Any? {
if self.count() == 0 { return nil }
let removed: Any? = self.value.removeAtIndex(self.value.startIndex)
return removed
}
func unshift(value: Any?...) -> Any? {
for v in value.reverse() {
self.value.insert(v, atIndex: self.value.startIndex)
}
return value
}
}
下記のような扱い方が可能です
class hoge {}
let c = hoge()
var b :ArrayLikePerl = ArrayLikePerl(["String", 1, c]) // 初期値を与える。混入可能
b.count() // 3
b.unshift("one", "two") // 配列の挿入
b.unshift("zero") // 1要素の挿入
b.value
b.count() // 6
b.push("push", "push2") // 配列の追加
b.push("push3") // 1要素の追加
b.value[3] // “String”
b.value
b.count() // 9 増えてる
b.shift() // {{Some “zero" }} 配列の先頭を取り出す
b.pop() // {{Some “push3”}} 配列の末尾を切り取る
b.count() // 7 減ってる