日記
きょうはよくなかった
今日書いたコード
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
この記事がわかりやすい.