【Swift】Scannerクラスとは?文字列の解析や探索方法!

【Swift】Scannerクラスとは?文字列の解析や探索方法!

この記事からわかること

  • SwiftScanner(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

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index