Swift4 での文字列操作

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

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

```swift:stringCount.swift
let moji = "あいうえお"
let cnt = moji.count    // 5
```

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

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

#英大文字、小文字変換
英大文字を小文字に変換するには.lowercased()メソッドを
英小文字を大文字に変換するには.uppercased()メソッドを使用します。

```swift:lowerUpperConvert.swift
let lowerString = "ABCDEFG".lowercased()    // abcdefgに変換される
let upperString = "abcdefg".uppercased()    // ABCDEFGに変換される
```

#ひらがな、カタカナ変換
ひらがなをカタカナに、カタカナをひらがなに変換する場合はapplyingTransformメソッドを使用します。第１引数には「.hiraganaToKatakana」を指定し、カタカナに変換する場合は第2引数のreverseにfalseを、ひらがなに変換する場合はreverseにtrueを指定します。

```swift:kanaHenkan.swift
// あいうえお→アイウエオに変換
var hiragana = "あいうえお".applyingTransform(.hiraganaToKatakana, reverse: false)

// アイウエオ→あいうえおに変換
var katakana = "アイウエオ".applyingTransform(.hiraganaToKatakana, reverse: true)
```

#半角英数小文字、全角英数大文字変換
半角英数小文字を全角英数大文字に、全角英数大文字を半角英数小文字に変換する場合はapplyingTransformメソッドを使用します。第１引数には「.fullwidthToHalfwidth」を指定し、全角英数大文字に変換する場合は第2引数のreverseにtrueを、半角英数小文字に変換する場合はreverseにfalseを指定します。

```swift:alphabetHenkan.swift
// ABCDE→ＡＢＣＤＥに変換
let zenkaku = "ABCDE".applyingTransform(.fullwidthToHalfwidth, reverse: true)
// ＡＢＣＤＥ→ABCDEに変換
let hankaku = "ＡＢＣＤＥ".applyingTransform(.fullwidthToHalfwidth, reverse: false)
```

#部分文字列を取得する
##先頭n文字、末尾n文字の取得

先頭のn文字取得するにはprefixメソッドを、末尾からn文字取得するにはsuffixメソッドを使用します。引数には取得する文字数を指定します。

```swift:prefixSuffix.swift
let moji = "ABCDEFG"
let prefixMoji = moji.prefix(3) // 先頭３文字の「ABC」
let suffixMoji = moji.suffix(2) // 末尾2文字の「FG」
```

##指定した位置の文字列を取得する

指定した位置の文字列を取得するには[]と範囲演算子を使用します。例えば2文字目から6文字目までの5文字を取得したい場合は以下のようにします。

```swift:prefixSuffix.swift
let moji = "ABCDEFG"
let partString = moji[moji.index(moji.startIndex, offsetBy: 1)..<moji.index(moji.startIndex, offsetBy: 6)]  // BCDEF
```

#文字列を数値に変換する
文字列から数値に変換するにはIntやDoubleを使用します。数値に変換できない場合はnilになります。

```swift:sujiHenkan.swift
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メソッドを使用します。引数に検索したい文字列を指定すると、その文字が含まれている範囲を返します。

```swift:searchString.swift
let sentence = "This is a ballpen."
// 文字列が見つかった場合はrangeに範囲が代入される
if let range = sentence.range(of: "ball") {
    print("\(sentence[range])が見つかりました。")
} else {
    print("文字列は見つかりませんでした。")
}
```

#文字列を分割する

文字列を分割するには、componentsメソッドを使用します。引数には分割に使用する文字列を指定します。.newlineのような指定も可能です。

```swift:sprit.swift
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メソッドを使用します。第１引数に置換する範囲を、第２引数に置換後の文字列を指定します。

```swift:replaceString1.swift
var moji = "赤い花"
if let range = moji.range(of: "赤い") {
    moji.replaceSubrange(range, with: "青い")
    print(moji)     // 青い花
}
```

先ほどのreplaceSubrangeメソッドは変数の中の文字列を直接書き換えるものです。置換後も元の文字列を保持しておきたい場合はreplacingCharctersメソッドを使用します。

```swift:replaceString2.swift
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を使用します。

```swift:radixConv.swift
String(15, radix: 2)    // 10進数の15を２進数「1111」に変換
String(15, radix: 8)    // 10進数の15を8進数「17」に変換
String(15, radix: 16)   // 10進数の15を16進数「f」に変換

Int("1111", radix: 2)   // ２進数「1111」を10進数に変換
Int("17", radix: 8)     // 8進数「17」を10進数に変換
Int("f", radix: 16)     // 16進数「f」を10進数に変換
```

#0埋めする

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

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