Day: May 27, 2015

Swift:これまた目から鱗。文字列検索。

文字列の検索には、こんな方法があったのですね。

(変更 5/30/2015) 文字列検索は、次のメソッドの方が取り組みやすいです。

pDataの中にpTargetという文字列が入っているかどうか調べてその文字位置を返す。マイナスのときはNot found.
func CallSearchWords(pData:String, pTarget:String)-> Int {

if count(pData) <= 0 || count(pTarget) <= 0 || count(pData) < count(pTarget) { return -1 } // == not found ==
else { }
var wRange  = NSRange(location: 0, length: 0)
wRange  = NSString(string: pData).rangeOfString(pTarget)
if wRange.length > 0 { return wRange.location } // == start index ==
else { return -2 }    // == not found ==
}

wStrigSourceという文字列にwTargetが入っているかどうか調べる方法です。参考まで。

例:var wRange0:Range = wStrigSource.rangeOfString(wTarget)!

var wStrigSource:String = “abc?efe”
var wTarget:String      = “?”
var wRange0:Range   = wStrigSource.rangeOfString(wTarget)!

ただし、実際には、次のように書く必要があります。検索文字列がないときnilが返ってくるようなので、これを無視して検索してあるか・ないかチェックしてしまうと、実行時にエラーになります。

var wStrigSource:String = “abc?efe”
var wTarget:String      = “?”
if wStrigSource.rangeOfString(wTarget)! == nil {
見つからないときの処理
} else {
var wRange0:Range   = wStrigSource.rangeOfString(wTarget)!
見つかったときの処理
}

もうひとつ重要なことは、ヒットした文字位置が返ってくるのですが、Intに直すには、特に注意が必要です。そのほか、startIndex+1と加算する場合も、注意が必要です。

Intに直す方法
var wStartindex:Int = distance(wStrigSource.startIndex, wRange1.startIndex)”)

.startIndex+1
var wIdex = advance(wRange0.startIndex, 1)

Swift:配列で泣き

この一年、わからないことはそれなりに調べているのですが、いい加減になっていることも多いです。

それではまずい事態のようなので、今、やっと真剣に配列について勉強し直しました。サンプルプログラムはあとからアップします。スタディ結果、これから先は、NSMutableArrayを使おうと考えています。

var wDicString:[String]=[] 

  • wDicString[0]=wString 文字列を[wString]のようにカギ括弧でくくらない
  • wDicString[0]=nil  nilは入れられない。空の文字“”ならOK
  • wDicString.append(1234)はダメ。数値(例:Int)は直接入れられない
  • wDicString[2] インデックスで抽出できる。インデックスは実在の範囲内であること。
  • wDicString[1]=wString  既存ならインデックスで置換可能
  • wDicString[999]=wString 実在しないと実行時にエラーになる。
  • wDicString.insert(wString, atIndex: 1) atIndexの前に挿入。実在しないとエラー。
  • wDicString.removeAtIndex(1) atIndexの行を削除。実在しないとエラー。
  • wDicString=[aa, 012345, bb, 1234]のような配列は作れない。
  • (追記) 範囲指定で削除することが可能。削除する開始行位置と終了位置を指定する。次の場合、3番目が削除される。wString[3…4] = []だと3行目から5行目の3行が削除され、removeRangeの終了行と意味が異なるので注意。
    例: wString.removeRange(Range (start: 3,end: 4))

var wDicArray1:[NSArray]=[]

  • wDicArray1.append([wString]) 鉤括弧でくくって[文字列]や[数値]を入れることができる。
  • あとは、var wDicString:[String]=[]と同じ。
  • [ ]の中にどの型を定義するかに処理は依存。
  • 配列の中の配列になるので、 wDicArray1[1][2]のよう書いて取り出す。

2次元配列
var wString:[NSArray] = []

wString.append([0, 1, 2, 3, 4, 5])
wString.append([10, 11, 12, 13, 14, 15])
println(__LINE__,”wString[1]=\(wString[1][1])です”)

var wMutableArray:NSMutableArray=[] 

  • 一次元[aa]、二次元[aa1,aa2]、三次元[[aa11, aa12],[aa21, aa22],[aa31, aa32]]の配列が可能。
  • 文字列、数値を直接入れるこもできる。
  • 鉤括弧でくくって配列(例:[“aa”, “bb”]として入れることもできる。
  • 二次元以上の配列の展開例

2次元配列
var wString3:NSMutableArray = []
wString3[0] = [0, 1, 2, 3, 4, 5]
wString3[1] = [10, 11, 12, 13, 14, 15]
println(__LINE__,”取り出し方は、wString3[0]=\(wString3[0])です。”)
println(__LINE__,”取り出し方は、wString3[1][1]=\(wString3[1][1])です。”)

3次元配列
var wString4:NSMutableArray = []

wString4[0] = [[0,   1,  2],  [3,  4,  5],  [6,  7,  8]]
wString4[1] = [[10, 11, 12], [13, 14, 15], [16, 17, 18]]
wString4[2] = [[20, 21, 22], [23, 24, 25], [26, 27, 28]]
println(__LINE__,”取り出し方は、wString3[0]=\(wString4[0])です。”)
println(__LINE__,”取り出し方は、wString3[1][1]=\(wString4[2][1][0])です。”)
println(__LINE__,”配列の個数の調べ方は、wString4[2][1].count=\(wString4[2][1].count)です。”)

NSMutableArrayに関する注意点

  •  wMutableArray.count 配列個数を調べるときは、.countを使う。
  • 検索・削除: 指定した値をNSRangeで範囲指定して検索して削除する
    wMutableArray.removeObject(wString,inRange:NSRange(location: 1, length: wMutableArray.count – 1)))
  • 削除: NSRangeで指示した削除開始位置から指定行数分を削除する。
    wMutableArray.removeObjectsInRange(NSRange(location:wStart, length: wLines)))
  • 削除: 指定した行を削除する。
    wMutableArray.removeObjectAtIndex(1)