Swift言語:String

概要

The Swift Programming Language (Swift 2.1): Strings and Charactersを参照して、Swiftの文字列処理について調べました。

articles of samekard: Swift 2.0でStringはどうなったか - 特殊文字などの扱いもとても参考になりました。

文字列処理

String Literals

ダブルコーテーションで囲むと文字列として取り扱われます。

let someString = "Some string literal value"

空文字で初期化

var emptyString = ""
var anotherEmptyString = String()

空文字かどうかはisEmptyメソッドでチェックできます。

if emptyString.isEmpty {
    print("Nothing to see here")
}

String Mutability

let変数にすると編集不可になります。

var variableString = "Horse"
variableString += " and carriage"
// variableString is now "Horse and carriage"
 
let constantString = "Highlander"
constantString += " and another Highlander"
// this reports a compile-time error - a constant string cannot be modified

Strings Are Value Types

Stringオブジェクトは、Reference型ではなく、Value型です。したがって、文字列変数を別の変数に代入すると値がコピーされます。

var val1 = "aaa"
var val2 = val1
val2 += "bbb"
print(val1)
print(val2)
//aaa
//aaabbb

Working with Characters

文字列の実体は、Characterです。for-inで個々のCharacterを取り出すことができます。

for character in "Dog!🐶".characters {
    print(character)
}
for c in "あいうえお".characters {
    print(c)
}
//1文字ずつ出力される
//あ, い, ...,お
let exclamationMark: Character = "!"
let catCharacters: [Character] = ["C", "a", "t", "!", "🐱"]
let catString = String(catCharacters)
print(catString)

Concatenating Strings and Characters

文字列の結合は+演算子やappendメソッドで行うことができます。

let string1 = "hello"
let string2 = " there"
var welcome = string1 + string2

var instruction = "look over"
instruction += string2

let exclamationMark: Character = "!"
welcome.append(exclamationMark)

String Interpolation

文字列の変数は、\()で値を出力することができます。

let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"

Unicode

Unicodeリテラルで文字列を初期化することができます。

let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"
// "Imagination is more important than knowledge" - Einstein
let dollarSign = "\u{24}"        // $,  Unicode scalar U+0024
let blackHeart = "\u{2665}"      // ♥,  Unicode scalar U+2665
let sparklingHeart = "\u{1F496}" // 💖, Unicode scalar U+1F496

違う文字コードの値を取得します。

if "あいうえお".canBeConvertedToEncoding(NSShiftJISStringEncoding) {
    "あいうえお".dataUsingEncoding(NSShiftJISStringEncoding)

}

文字コードはint値で、Foundationクラスで定義されています。

$ cat swift-corelibs-foundation/CoreFoundation/String.subproj/CFStringUtilities.c
// 抜粋
    NSJapaneseEUCStringEncoding = 3,
    NSUTF8StringEncoding = 4,
    NSISOLatin1StringEncoding = 5,
    NSSymbolStringEncoding = 6,
    NSNonLossyASCIIStringEncoding = 7,
    NSShiftJISStringEncoding = 8,
    NSISOLatin2StringEncoding = 9,
    NSUnicodeStringEncoding = 10,
    NSWindowsCP1251StringEncoding = 11,    /* Cyrillic; same as AdobeStandardCyrillic */
    NSWindowsCP1252StringEncoding = 12,    /* WinLatin1 */
    NSWindowsCP1253StringEncoding = 13,    /* Greek */
    NSWindowsCP1254StringEncoding = 14,    /* Turkish */
    NSWindowsCP1250StringEncoding = 15,    /* WinLatin2 */
    NSISO2022JPStringEncoding = 21,         /* ISO 2022 Japanese encoding for e-mail */
//...

その他文字列クラスのメソッド

部分文字列

print("あいうえお".substringFromIndex(2))
//うえお
print("あいうえお".substringToIndex(2))
//あい

先頭を大文字にする

print("abcde".capitalizedString)
// Abcde

文字列長

文字列長は、characterの数。

print("あいうえお".characters.count)
// 5

文字列のバイト数。文字コードを指定します。

print("あいうえお".lengthOfBytesUsingEncoding(NSShiftJISStringEncoding))
// 10

関連資料