2016年9月13日

Swift 3.0でStringはどうなったか

前回Swift2.0のStringの仕様を調べたが、編集系(append, insert, remove, replace)のメソッドの仕様は整理しきれていない、というくやしい終わり方をした。
Swift 2.0でStringはどうなったか - 特殊文字などの扱い

今回はまず、この編集系メソッドから見ていく。
編集系メソッドの引数に与えるものは主にCharacterとStringであるが 、そのほかにCharacterを要素にもつシーケンスというものがある。これは、名前がSとして
<S : Sequence where S.Iterator.Element == Character>
という性質を持つ。ここではこれを「Characterシーケンス」ということにする。

append(連結)系

Swift2.0ではメソッド名がバラバラだったものが、めでたくappendに統一された。
CharacterやStringの場合は引数ラベルなしで与える。
Characterシーケンスの場合はラベルにcontentOfが付けられる。
mutating func append(_ c: Character)
mutating func append(_ other: String)
mutating func append<S : Sequence where S.Iterator.Element == Character>(contentsOf newElements: S)

このほかに土台のStringに変更を加えないで、与えられたものを追加したStringを返すメソッドがある。
func appending(_ aString: String) -> String
これは土台のStringが変更されないので、mutatingが付けられていない。他の編集系メソッドにも語尾がingでこの性質のメソッドがある。

insert(挿入)系

これも名前がinsertに統一された。
appendと同じようにCharacterシーケンスの場合はラベルにcontentOfが付けられる。
Stringを受けるものはない?
mutating func insert(_ newElement: Character, at i: String.Index)
mutating func insert<S : Collection where S.Iterator.Element == Character>(contentsOf newElements: S, at i: String.Index)

remove(削除)系

remove系は1文字削除、範囲指定削除、全削除の3つ。
1文字削除の場合はatラベルが付くが、範囲指定削除の場合はラベルなし。Allは仕方ないとして、1文字削除と範囲指定削除の統一の夢は果たせなかった。
範囲指定の場合、HalfOpenでも可。
mutating func remove(at i: String.Index) -> Character
mutating func removeSubrange(_ bounds: Range<String.Index>)
mutating func removeAll(keepingCapacity keepCapacity: Bool = default)

replace(交換)系

場所の指定方法はRange指定のみ。Index指定はなし。範囲指定はHalfOpenでも可。
交換するものはStringかCharacterコレクション。Characterはなし。

mutating func replaceSubrange(_ bounds: Range<String.Index>, with newElements: String)
mutating func replaceSubrange<C where C : Collection, C.Iterator.Element == Character>(_ bounds: Range<String.Index>, with newElements: C)

土台Stringに変更を加えないで編集したものを返す、mutatingが付かないメソッドがある。
func replacingCharacters(in range: Range<String.Index>, with replacement: String) -> String

土台Stringに変更を加えないで範囲内を置換する
func replacingOccurrences(of target: String, with replacement: String, options: String.CompareOptions = default, range searchRange: Range<String.Index>? = default) -> String

0 件のコメント:

コメントを投稿