[Swift3] Stringのプロパティ/メソッドのまとめ （文字列操作）

# はじめに
3日目は、[（株）スマートテック・ベンチャーズ](https://www.wantedly.com/projects/72590?ql=gaJpZM4AKYPb)の串田(@eKushida)が担当します。
今回は、Stringのプロパティとメソッドをまとめました。

# ラインナップ
下記にSwift2との変更有無も合わせて、リストアップしました。

|項番|説明|Swift2.x|Swift3.x|
|---|---|---|---|
|1|空文字チェックする|isEmpty|変更なし|
|2|文字数を取得する|characters.count|変更なし|
|3|文字列の一部を取得する|substringToIndex<br>substringFromIndex<br>substringWithRange|変更あり<br>substring |
|4|文字列を数値に変換する|Int|変更なし|
|5|文字列を区切り文字で分割する|componentsSeparatedByString|変更あり<br>components|
|6|文字列を置換する|stringByReplacingOccurrencesOfString|変更あり<br>replacingOccurrences|
|7|文字列のPrefixを調べる|hasPrefix|変更なし|
|8|文字列のSuffixを調べる|hasSuffix|変更なし|
|9|文字列に該当の文字列が含まれるか調べる|rangeOfString|変更あり<br>range|
|10|文字列の前後の空白を削除する|stringByTrimmingCharactersInSet|変更あり<br>trimmingCharacters|
|11|文字列の前後の改行を削除する|stringByTrimmingCharactersInSet|変更あり<br>trimmingCharacters|
|12|文字列をURLエンコードする|stringByAddingPercentEncodingWithAllowedCharacters|変更あり<br>addingPercentEncoding|
|13|文字列をURLデコードする|stringByRemovingPercentEncoding|変更あり<br>removingPercentEncoding|
|14|文字列を大文字に変換する|uppercaseString|変更あり<br>uppercased|
|15|文字列を小文字に変換する|lowercaseString|変更あり<br>lowercased|

## サンプル
Swift3.x系の利用シーンをご説明します。

### 1. 空文字チェックする(isEmpty)

```swift:Swift2/3
        let str = ""
        print(str.isEmpty ? "空です" : str)

        // 実行結果
        // 空です
```

### 2. 文字数を取得する(characters.count)

```swift:Swift2/3
        let str = "1234567890"
        print(str.characters.count) 

        // 実行結果
        // 10
```

### 3. 文字列の一部を取得する(substring)

```swift:Swift3
        let str = "1234567890"

        //先頭から5文字
        print(str.substring(to: str.index(str.startIndex, offsetBy: 5))) 

        //末尾から3文字
        print(str.substring(from: str.index(str.endIndex, offsetBy: -3))) 

        //先頭から3文字〜末尾から3文字の範囲
        print(str.substring(with: str.index(str.startIndex, offsetBy: 3) ..< str.index(str.endIndex, offsetBy: -3)))

        // 実行結果
        // 12345
        // 890
        // 4567
```

```swift:Swift2
        let str = "1234567890"
        
        //先頭から5文字
        print(str.substringFromIndex(str.startIndex.advancedBy(5)))
        
        //末尾から3文字
        print(str.substringFromIndex(str.endIndex.advancedBy(-3)))
        
        //先頭から3文字〜末尾から3文字の範囲
        let startIndex = str.startIndex.advancedBy(3)
        let endIndex = startIndex.advancedBy(3)
        print(str.substringWithRange(Range(start:startIndex , end: endIndex)))
```

### 4. 文字列を数値に変換する(Int)

```swift:Swift2/3
        let testData = ["1","2","♥","4","あ"]

        _ = testData.map {
            print(Int($0) ?? "数値以外")
        }

        // 実行結果
        // 1
        // 2
        // 数値以外
        // 4
        // 数値以外
```

### 5. 文字列を区切り文字で分割する(components)

```swift:Swift3
        let str = "a,b,c,d,e,f,g"
        let separatedArray = str.components(separatedBy: ",")

        _ = separatedArray.map {
            print($0)
        }

        // 実行結果
        // a
        // b
        // c
        // d
        // e
        // f
        // g
```

```swift:Swift2
        let str = "a,b,c,d,e,f,g"
        let separatedArray = str.componentsSeparatedByString(",")
        
        _ = separatedArray.map {
            print($0)
        }
```

### 6. 文字列を置換する(replacingOccurrences)

```swift:Swift3
        let str = "S♥T♥V"
        print(str.replacingOccurrences(of: "♥", with: ""))

        // 実行結果
        // STV
```

```swift:swift2
        let str = "S♥T♥V"
        print(str.stringByReplacingOccurrencesOfString("♥", withString: ""))
```

### 7. 文字列のPrefixを調べる(hasPrefix)

```swift:Swift2/3
        let testData = ["stv001","Stv002","stv003","ssd004","s"]

        let stvMembers = testData.filter {
            $0.hasPrefix("stv")
        }

        _ = stvMembers.map {
            print($0)
        }

        // 実行結果
        //stv001
        //stv003
```

### 8. 文字列のSuffixを調べる(hasSuffix)

```swift:Swift2/3
        let testData = ["stv001","Stv002","stv003","ssd004","s001"]

        let firstMembers = testData.filter {
            $0.hasSuffix("001")
        }

        _ = firstMembers.map {
            print($0)
        }

        // 実行結果
        //stv001
        //s001
```

### 9. 文字列に該当の文字列が含まれるか調べる(range)

```swift:Swift3
        let str = "あああああああああstvいいいいいいいいいいいいい"

        if let index = str.range(of: "stv") {
            print("見つかりました。 index: \(str.distance(from: str.startIndex, to: index.lowerBound))")
        } else {
            print("見つかりませんでした")
        }

        // 実行結果
        // 見つかりました。 index: 9
```

```swift:swift2
        let str = "あああああああああstvいいいいいいいいいいいいい"
        
        if let range = str.rangeOfString("stv") {
            print("見つかりました。 index: \(range.startIndex)")
        } else {
            print("見つかりませんでした")
        }
```

### 10. 文字列の前後の空白を削除する(trimmingCharacters)

```swift:Swift3
        let str = " STV　"
        print(str.trimmingCharacters(in: .whitespaces).uppercased())

        // 実行結果
        // STV
```

```swift:swift2
        let str = " STV　"
        print(str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()))
```

### 11. 文字列の前後の改行を削除する(trimmingCharacters)

```swift:Swift3
        let str = "\nSTV\n"
        print(str.trimmingCharacters(in: .whitespacesAndNewlines).uppercased())

        // 実行結果
        // STV
```

```swift:swift2
        let str = "\nSTV\n"
        print(str.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet()))
```

### 12. 文字列をURLエンコードする(addingPercentEncoding)

```swift:Swift3
        let str = "スマートテック・ベンチャーズ"
        print(str.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) ?? "エンコードできませんでした")

        // 実行結果
        // %E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%86%E3%83%83%E3%82%AF%E3%83%BB%E3%83%99%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%82%BA
```

```swift:swift2
        let str = "スマートテック・ベンチャーズ"
        print(str.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()) ?? "エンコードできませんでした")
```

### 13. 文字列をURLデコードする(removingPercentEncoding)

```swift:Swift3
        let str = "%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%86%E3%83%83%E3%82%AF%E3%83%BB%E3%83%99%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%82%BA"
        print(str.removingPercentEncoding ?? "デコードできませんでした")

        // 実行結果
        // スマートテック・ベンチャーズ
```

```swift:swift2
        let str = "%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%86%E3%83%83%E3%82%AF%E3%83%BB%E3%83%99%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%82%BA"
        print(str.stringByRemovingPercentEncoding ?? "デコードできませんでした")
```

### 14. 文字列を大文字に変換する(uppercased) 

```swift:Swift3
        let str = "stv"
        print(str.uppercased())

        // 実行結果
        // STV
```

```swift:swift2
        let str = "stv"
        print(str.uppercaseString)
```

### 15. 文字列を小文字に変換する(lowercased) 

```swift:Swift3
        let str = "STV"
        print(str.lowercased())

        // 実行結果
        // stv
```

```swift:swift2
        let str = "STV"
        print(str.lowercaseString)
```

# 最後に
他にも利用するものがあれば、随時追加したいと思います。
最後までご覧いただき、ありがとうございました。

スマートテック・ベンチャーズでは、未経験だけどiOSの開発をやりたい！という人を募集しています。
Advent Calendarのスマートテック・ベンチャーズページに会社およびWantedlyのURLをのせていますので、興味のある方は是非ご覧ください。
https://www.wantedly.com/companies/st-ventures/info

明日は、@k_motoさんです。
お楽しみに！