1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

swiftで定義するperl風な配列操作

Last updated at Posted at 2015-01-16

結論から言って、[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 減ってる

続きはこちら [Swift]extensionで実装するPerl風の配列操作

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?