こんにちは、nukkyです。
今回はSwift4でStringがコレクション化されましたが、あらためて文字列操作をまとめて見ました。
自分の備忘録がてら初心者の方にもStringでこういうことが出来るということを知ってもらいたいです。
Swift 3で打ち切られていた「文字列のコレクション化」が復活しました。コレクションに適合していると、以下のようなことができます。
基本的にはArrayやDictionaryで普段使っていると思うので、馴染みがあるのではと思います。
文字列のコレクション化に伴って、文字列の長さはcount
プロパティで取得できるようになります。
今まではStringを構成するcharacters
の要素数で判定する方法((ちなみに、この方法は不正確なので注意)などが取られていましたが、String自身のカウントをするだけで事足りるように強化されました。
// Swift 3 では "Hello World".characters.count // Swift 4 では "Hello World".count
しかも、取得できる値はUnicodeのいくつかの諸問題も解決した強固なものになっています。これまで絵文字などの特殊文字に苦しめられてきましたが、もうそこに悩む必要はなくなりそうです。
Swift 4からは、複数行にわたって文字列を定義することができるようになります。
Swift 3ではこのように1行で定義しなくてはいけなかったのですが、
let text = "文字列を\n複数行書きたいときは\nこのように"
Swift 4ではこのように複数行にわたって定義できます。
let text = "文字列を 複数行書きたいときは このように"
英大文字を小文字に変換するには.lowercased()メソッドを
英小文字を大文字に変換するには.uppercased()メソッドを使用します。
let lowerString = "ABCDEFG".lowercased() // abcdefgに変換される let upperString = "abcdefg".uppercased() // ABCDEFGに変換される
ひらがなをカタカナに、カタカナをひらがなに変換する場合はapplyingTransformメソッドを使用します。第1引数には「.hiraganaToKatakana」を指定し、カタカナに変換する場合は第2引数のreverseにfalseを、ひらがなに変換する場合はreverseにtrueを指定します。
// あいうえお→アイウエオに変換 var hiragana = "あいうえお".applyingTransform(.hiraganaToKatakana, reverse: false) // アイウエオ→あいうえおに変換 var katakana = "アイウエオ".applyingTransform(.hiraganaToKatakana, reverse: true)
半角英数小文字を全角英数大文字に、全角英数大文字を半角英数小文字に変換する場合はapplyingTransformメソッドを使用します。第1引数には「.fullwidthToHalfwidth」を指定し、全角英数大文字に変換する場合は第2引数のreverseにtrueを、半角英数小文字に変換する場合はreverseにfalseを指定します。
// ABCDE→ABCDEに変換 let zenkaku = "ABCDE".applyingTransform(.fullwidthToHalfwidth, reverse: true) // ABCDE→ABCDEに変換 let hankaku = "ABCDE".applyingTransform(.fullwidthToHalfwidth, reverse: false)
先頭のn文字取得するにはprefixメソッドを、末尾からn文字取得するにはsuffixメソッドを使用します。引数には取得する文字数を指定します。
let moji = "ABCDEFG" let prefixMoji = moji.prefix(3) // 先頭3文字の「ABC」 let suffixMoji = moji.suffix(2) // 末尾2文字の「FG」
指定した位置の文字列を取得するには[]と範囲演算子を使用します。例えば2文字目から6文字目までの5文字を取得したい場合は以下のようにします。
let moji = "ABCDEFG" let partString = moji[moji.index(moji.startIndex, offsetBy: 1)..<moji.index(moji.startIndex, offsetBy: 6)] print(partString) // BCDEF
文字列から数値に変換するにはIntやDoubleを使用します。数値に変換できない場合はnilになります。
let moji1 = "12" let suji1 = Int(moji1) // 12 //let suji1 = Int("あいう") // Intに変換できないのでnilになる let moji2 = "12.3" let suji2 = Double(moji2) // 12.3 //let suji2 = Int(moji2) // Intに変換できないのでnilになる
任意の文字列が含まれているかを調べるにはrangeメソッドを使用します。引数に検索したい文字列を指定すると、その文字が含まれている範囲を返します。
let sentence = "This is a ballpen." // 文字列が見つかった場合はrangeに範囲が代入される if let range = sentence.range(of: "ball") { print("\(sentence[range])が見つかりました。") } else { print("文字列は見つかりませんでした。") }
文字列を分割するには、componentsメソッドを使用します。引数には分割に使用する文字列を指定します。.newlineで改行コードの指定も可能です。
let moji1 = "ABC,DEF,GHI" let array1 = moji1.components(separatedBy: ",") // ,で分割する let moji2 = "ABC;DEF;GHI" let array2 = moji1.components(separatedBy: ";") // ;で分割する let moji3 = "ABC\nDEF\nGHI" let array3 = moji2.components(separatedBy: .newlines) // 改行コードで分割する
文字列を置換するには replaceSubrangeメソッドを使用します。第1引数に置換する範囲を、第2引数に置換後の文字列を指定します。
var moji = "赤い花" if let range = moji.range(of: "赤い") { moji.replaceSubrange(range, with: "青い") print(moji) // 青い花 }
先ほどのreplaceSubrangeメソッドは変数の中の文字列を直接書き換えるものです。置換後も元の文字列を保持しておきたい場合はreplacingCharctersメソッドを使用します。
if let range = moji.range(of: "赤い") { let repStr = moji.replacingCharacters(in: range, with: "青い") print(moji) // 赤い花 print(repStr) // 青い花 }
10進数を2進数や16進数に変換したり、2進数や16進数を10進数に変換するにはIntやStringを使用します。
String(15, radix: 2) // 10進数の15を2進数「1111」に変換 String(15, radix: 8) // 10進数の15を8進数「17」に変換 String(15, radix: 16) // 10進数の15を16進数「f」に変換 Int("1111", radix: 2) // 2進数「1111」を10進数に変換 Int("17", radix: 8) // 8進数「17」を10進数に変換 Int("f", radix: 16) // 16進数「f」を10進数に変換
0埋めした数値を作成したい場合は、Stringでformat指定をします。
let num1 = String(format: "%04d",5) // 0005 let num2 = String(format: "%0.3f", 0.1) // 0.100
StringのSwift4の変更点とよく使いそうな文字列操作をまとめて見ました。個人的にはcountがとてもありがたいですね。
私自身もあまり使用しない文字列操作はやり方を忘れがちなので結構お役に立てるのではと思っています。
RE:ENGINESブログ「iOS記事」まとめページはこちらから
[iOS 11] Swift 4は前バージョンから何が変わったか比較した
あなたの知らないCollectionの世界
https://developer.apple.com/documentation/swift/string