これは何?
guardを使って早期リターンをするとき、一緒にログを出力したいことがあります。
guard let data = optionlData else { return print("dataが取れない") }
短いログならこうしたいのですが、値を返す必要がある場合は
guard let data = optionalData else {
print("data がとれない")
return ""
}
こうなってしまいます。
これをなんとか1行にしたい。ただそれだけのためのクラスを作りました。
###参考
コピーされててどれがオリジナルかわかりませんが、この辺りを参考にしています。
普通のログ出力
値を返さない場合
上のリンク先のログ出力部分抜粋です。
class Logger {
func log(_ message: String, function: String = #function, file: String = #file, line: Int = #line) {
let logMessage = stringRepresentation(message, function: function, file: file, line: line)
printToConsole(logMessage)
printToDestination(logMessage)
}
}
まずこれに簡単に使えるようにstaticなインスタンスを用意します。
extension Logger {
static let shared = Logger(URL(fileURLWithPath: "/path/to/log"))
}
これで値を返す必要がない場合は
guard let data = optionlData else { return Logger.shared.log("dataが取れない") }
と書けるようになりました。
値を返す必要がある場合
同じ書き方で値を返せるようにします。
extension Logger {
func log<T>(_ message: String, value: T, function: String = #function, file: String = #file, line: Int = #line) -> T {
log(message, function: function, file: file, line: line)
return value
}
}
ジェネリクスで返す値を渡すだけです。
こうすることで、値を返す必要があるときでも
guard let data = optionlData else { return Logger.shared.log("dataが取れない", value: "") }
とほぼ同じ書き方ができるようになります。
問題点
失敗する可能性のあるイニシャライザでこれを使ってnilを返すことができません。
init?(_ index: Int) {
guard case 0..<4 = index else { return Logger.shared.log("out of bounds.", value: nil) }
// do something.
}
これはコンパイルエラーになります。