web-dev-qa-db-ja.com

「文字列」が予期される型「CVarArg」に準拠していません

NSLogを使用してログを記録しようとすると、次のエラーが発生します。

remote: /tmp/build_f459d376d1bc10ac2e93e52575ac5ea9/Sources/App/main.Swift:368:49: error: argument type 'String' does not conform to expected type 'CVarArg'
remote:                     NSLog("FILE NOT AVAILABLE", "TESTNOTI")
remote:                                                 ^~~~~~~~~~
remote:                                                            as! CVarArg

これが私のコードです:

if fileManager.fileExists(atPath: (drop.config["servers", "default", "KeyURL"]?.string ?? "default")) {
    NSLog("FILE AVAILABLE", "TESTNOTI")
} else {
    NSLog("FILE NOT AVAILABLE", "TESTNOTI")
}

なぜこれが発生し、どうすれば修正できますか?

11
O-mkar

NSLogは、最初の引数として形式の文字列を取り、その後に引数のリストが続きます。これらの引数は、フォーマット文字列(比較 文字列フォーマット指定子 )。

Appleプラットフォームでは、%@形式を使用してStringを印刷できます。

let fileName = "the file"
NSLog("File not found: %@", fileName)

ただし、これはLinuxプラットフォーム(Vaporなど)では機能しません。ここでは、Swift文字列をC文字列に変換して、引数としてNSLogに渡す必要があります(C文字列には%s形式を使用します)。

let fileName = "the file"
fileName.withCString {
    NSLog("File not found: %s", $0)
}
15
Martin R

あなたはVaporフレームワークを使用しているようです、そして私は引用します:

Linuxではまだすべてのコアライブラリ(Foundation)が利用できるわけではありません。

Vaporで作成した問題は、すでに回答を得ています: https://github.com/vapor/vapor/issues/87

1
Laffen