web-dev-qa-db-ja.com

Swift NSErrorオブジェクトの作成

ユーザーに表示するエラーオブジェクトを作成しようとしています。

let userInfo: [NSObject : AnyObject] = 
    [
    "NSLocalizedDescriptionKey" :  NSLocalizedString("Unauthorized", comment: ""),
    "NSLocalizedFailureReasonErrorKey" : NSLocalizedString("Unauthorized", comment: "")
    ]
let err = NSError(domain: "ShiploopHttpResponseErrorDomain", code: httpResponse.statusCode, userInfo: userInfo)
print("Error in Post: \(err.localizedDescription)")

残念ながら、出力は次のとおりです。

Error in Post: The operation couldn’t be completed.(ShiploopHttpResponseErrorDomain error 401.) 

ユーザーにアカウントを有効にする必要があることをユーザーに示すことができます。何か案は??

31
Ehab Saifan

あなたが望むように見える(辞書のキーを参照):

スイフト2

let userInfo: [NSObject : AnyObject] =
[
    NSLocalizedDescriptionKey :  NSLocalizedString("Unauthorized", value: "Please activate your account", comment: ""),
    NSLocalizedFailureReasonErrorKey : NSLocalizedString("Unauthorized", value: "Account not activated", comment: "")
]

スイフト3

let userInfo: [AnyHashable : Any] =
            [
                NSLocalizedDescriptionKey :  NSLocalizedString("Unauthorized", value: "Please activate your account", comment: "") ,
                NSLocalizedFailureReasonErrorKey : NSLocalizedString("Unauthorized", value: "Account not activated", comment: "")
        ]

次に、次のようにSwift 2または3の両方でエラーオブジェクトを作成します。

let err = NSError(domain: "ShiploopHttpResponseErrorDomain", code: 401, userInfo: userInfo)
println("Error in Post: \(err.localizedDescription)")

NSLocalizedDescriptionKeyとNSLocalizedFailureReasonErrorKeyは、グローバル文字列変数であり、userInfoディクショナリ内のキーです。値は指定したものとわずかに異なります。

println(NSLocalizedDescriptionKey) //prints "NSLocalizedDescription"
println(NSLocalizedFailureReasonErrorKey) //prints "NSLocalizedFailureReason"

クラス(この場合はNSError)を右クリックし、xcode内で「Jump To Definition」を選択することで、ドキュメントを確認することをお勧めします。このようにして、あらゆる種類の質問に答えることができます。 :)

29
ProgrammierTier

Swift 3:

let error = NSError(domain: "", code: 0, userInfo: [NSLocalizedDescriptionKey : "Object does not exist"])
24
Josh O'Connor

エラーの作成は次の行と同じくらい簡単です。

let error = NSError(domain: "com.example.error", code: 0, userInfo: [NSLocalizedDescriptionKey: "message"])

追加のスタックトレース情報が必要な場合は、次の方法を使用します。

func error(_ message: String, code: Int = 0, domain: String = "com.example.error", function: String = #function, file: String = #file, line: Int = #line) -> NSError {

    let functionKey = "\(domain).function"
    let fileKey = "\(domain).file"
    let lineKey = "\(domain).line"

    let error = NSError(domain: domain, code: code, userInfo: [
        NSLocalizedDescriptionKey: message,
        functionKey: function,
        fileKey: file,
        lineKey: line
    ])

    // Crashlytics.sharedInstance().recordError(error)

    return error
}

使用法:

let localizedErrorMessage: String = NSLocalizedString("Unauthorized", comment: "Account not activated")
let error = error(localizedErrorMessage)
10
AamirR