2015-10-15 78 views
19

我想创建一个错误对象以显示给用户。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.) 

我希望能够展示给他应该激活他的帐户的用户。有任何想法吗??

回答

21

看起来你想要的(见字典键):

斯威夫特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: "") 
     ] 

然后创建错误对象两者都是wift 2或3这样的:

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

NSLocalizedDescriptionKey和NSLocalizedFailureReasonErrorKey是全局字符串变量,以及用户信息的字典内的密钥。该值是从指定什么稍有不同:

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

,我觉得是个好习惯通过右键单击(在这种情况下NSError)类和选择看文档“跳转到” Xcode的范围内。各种问题都可以这样回答。 :)

+0

这也可能是有意义从NSError继承,然后重写为localizedDescription吸气创建自己的错误类。 – ProgrammierTier

+0

事情是我应该子类NSError能够定制“NSLocalizedDescriptionKey”来显示我的自定义消息。我是Swift和编程新手。所以我将不得不挖掘知道如何实现这个:) thx为您的回应 –

5

这里是一个具有一些附加堆栈跟踪信息来创建NSError对象我Helper方法:

class Helper { 

    static let errorDomain = "com.example.error" 
    static let errorFuncKey = "com.example.error.function" 
    static let errorFileKey = "com.example.error.file" 
    static let errorLineKey = "com.example.error.line" 

    static func error(_ message: String, record: Bool = true, function: String = #function, file: String = #file, line: Int = #line) -> NSError { 

     let customError = NSError(domain: errorDomain, code: 0, userInfo: [ 
      NSLocalizedDescriptionKey: message, 
      errorFuncKey: function, 
      errorFileKey: file, 
      errorLineKey: line 
     ]) 

     // if (record) { 
     //  customError.record() 
     // } 

     return customError 
    } 
} 

用法:

let error = Helper.error(NSLocalizedString("Unauthorized", comment: "Account not activated")) 

通知 3在辅助类注释行,我用它来记录Crashlytics中的错误,您可以取消上面的注释并使用以下扩展名记录Crashlytics中的错误:

extension NSError { 

    func record() { 
     Crashlytics.sharedInstance().recordError(self) 
    } 

} 
+0

为什么downvote,上面的代码不会创建NSError对象,isnt?,你怎么解决这个问题(如果确实有一个),而不知道为什么该人投票了吗?我从来没有投下他人对我回答的问题的回答,但我却投了其他人的票。不管怎么说,多谢拉! – AamirR

5

创建斯威夫特3一个非常简单的错误:

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