3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Swift] guard を1行で書きたい。ただそれだけなんです!

Last updated at Posted at 2017-11-30

これは何?

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.
}

これはコンパイルエラーになります。

3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?