[Tips]Swift4での文字列操作

はじめに

どのようなプログラミング言語であっても、文字列操作は頻繁に使用しますし、必要不可欠な技術です。

今回はSwift4における文字列操作について説明します。

環境

macOS High Sierra 10.13.3
Xcode 9.2(9C40b)
Swift 4.0.3

目次

文字列のカウント

文字列をカウントするにはcountプロパティを使用します。
変数に入っている文字列をカウントするには以下のように記述します。

let moji = "あいうえお"
let cnt = moji.count    // 5

ダブルクオーテーションで囲まれた文字列の後に.countを付けてもカウントが可能です。

let cnt = "あいうえお".count

英大文字、小文字変換

英大文字を小文字に変換するには.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)

半角英数小文字、全角英数大文字変換

// ABCDE→ABCDEに変換
let zenkaku = "ABCDE".applyingTransform(.fullwidthToHalfwidth, reverse: true)
// ABCDE→ABCDEに変換
let hankaku = "ABCDE".applyingTransform(.fullwidthToHalfwidth, reverse: false)

部分文字列を取得する

先頭n文字、末尾n文字の取得

先頭の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)]  // 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 suji3 = 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埋めする

0埋めした数値を作成したい場合は、Stringでformat指定をします。

let num1 = String(format: "%04d",5)         // 0005
let num2 = String(format: "%0.3f", 0.1)     // 0.100

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください