日記
きょうはよくなかった
今日書いたコード
struct Chessboard { let boardColors: [Bool] = { var temporaryBoard: [Bool] = [] var isBlack = false for i in 1...8 { for j in 1...8 { temporaryBoard.append(isBlack) isBlack = !isBlack } isBlack = !isBlack } return temporaryBoard }() func squareIsBlackAt(row: Int, column: Int) -> Bool { return boardColors[(row * 8) + column] } } let board = Chessboard() print(board.squareIsBlackAt(row: 0, column: 1)) // true print(board.squareIsBlackAt(row: 7, column: 7)) // false
初めて知ったこと
swift-bookからは特になし.
今日正規表現を使って数字を抜き出すコードを書いていたんだけど,\dと[0-9]でマッチする文字が違うというのを知った.
Swiftの正規表現における\dはUnicodeのNdと呼ばれるGeneral Category(このpdfのTable 4-4に一覧がある)にマッチするMetacharacterである.例えば,以下のコードを実行すると12345١٢٣٤٥が出力される.これは١٢٣٤٥がアラビア文字圏で数字を表すのに使われる文字で,Ndに含まれるから.
let str = "abcde12345١٢٣٤٥" let regex = try! NSRegularExpression(pattern: "(\\d+)") let result = regex.firstMatch(in: str, range: .init(location: 0, length: str.count))! str[Range(result.range, in: str)!] // 12345١٢٣٤٥
[0-9]は0, 1, 2, 3, 4, 5, 6, 7, 8, 9にだけマッチするなにか(正式名称を調べる気力はなかった)である.今回の用途にはこちらのほうが合っているのでこちらを採用した.
let str = "abcde12345١٢٣٤٥" let regex = try! NSRegularExpression(pattern: "([0-9]+)") let result = regex.firstMatch(in: str, range: .init(location: 0, length: str.count))! str[Range(result.range, in: str)!] // 12345
この記事がわかりやすい.