【Swift】Scannerクラスとは?文字列の解析や探索方法!
この記事からわかること
- SwiftのScanner(NSScanner)クラスの使い方
- 文字列の探索や解析の方法
- CSVからデータを読み取る
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Scannerクラスとは?
参考文献:Scannerクラス
class Scanner : NSObject
Scanner(旧名:NSScanner)クラスとは文字列やファイルなどの入力ストリームからデータを解析するためのクラスです。
このクラスを使用することでHTMLやCSVなどのデータ解析や、10進数や16進数の数値をスキャンするといったことが可能になります。
使い方
使用するにはイニシャライザinit(string:)
を使用して文字列(String型)からScanner
オブジェクトを生成する必要があります。
let str:String = "123"
let scanner:Scanner = Scanner(string: str)
例えばscanInt
メソッドを使用して文字列の中から数値を取得し、指定した変数intValue
に格納することができます。
var intValue:Int = 0
scanner.scanInt(&intValue) // intValueには123がセットされる
print(intValue) // 123
イニシャライザ
使用できるイニシャライザは以下の通りです。
init(string: String)
// 指定した文字列を入力ストリームとしてScannerオブジェクトを生成
プロパティ
プロパティからは対象の文字列やスキャン開始位置、終端に達したかのフラグを参照できます。
var string: String // スキャナーがスキャンする文字列
var scanLocation: Int // スキャナーが次のスキャン操作を開始する文字位置
var caseSensitive: Bool // スキャナーがスキャンする文字と小文字を区別するかどうかを示すフラグ
var charactersToBeSkipped: CharacterSet? // スキャン可能な要素を探すときにスキャナが無視する文字を含む文字セット
var locale: Any? // スキャン時に使用するロケール
var isAtEnd: Bool // 入力ストリームの終端に到達したかどうかを判定するフラグ
メソッド
スキャンするメソッドとして文字列や数値、浮動小数点型、16進数などが用意されています。引数UnsafeMutablePointer
から対象のデータを受け取ることが可能です。
func scanInt(_ : UnsafeMutablePointer<Int>?) // 入力ストリームから整数を読み取る
func scanDouble(_ : UnsafeMutablePointer<Double>?) // 入力ストリームから倍精度浮動小数点数を読み取る
func scanUpTo(_ : String, into: AutoreleasingUnsafeMutablePointer<NSString?>?) // 指定した文字列が出現するまでの文字列を読み取る
使用例:CSVデータからデータを読み取る
例えばCSVデータからデータを読み取る場合は以下のようになります。
// CSVファイルからデータを読み取る例
let csvStr = "Apple,Red,50\nBanana,Yellow,100\nOrange,Orange,75\n"
let csvScanner = Scanner(string: csvStr)
csvScanner.charactersToBeSkipped = CharacterSet(charactersIn: ",\n")
while !csvScanner.isAtEnd {
var name: NSString? = nil
var color: NSString? = nil
var price: Int = 0
csvScanner.scanUpToCharacters(from: csvScanner.charactersToBeSkipped, into: &name)
csvScanner.scanUpToCharacters(from: csvScanner.charactersToBeSkipped, into: &color)
csvScanner.scanInt(&price)
if let productName = name as String?, let productColor = color as String? {
print("Product: \(productName), Color: \(productColor), Price: \(price)")
}
}
// Product: Apple, Color: Red, Price: 50
// Product: Banana, Color: Yellow, Price: 100
// Product: Orange, Color: Orange, Price: 75
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。