[swift-users] Proper Way to make Errors in Swift 3
Ronak
ronak2121 at yahoo.com
Thu Sep 29 16:43:29 CDT 2016
Hi,
I’ve actually switched our implementation to:
/// The type of an error code.
@objc public enum FoundationErrorCode: Int {
/// An ARCOperationCondition failed during evaluation
case operationConditionFailed = 10000
/// An ARCOperation failed during execution
case operationExecutionFailed = 10001
/// An unsupported HTTP Method was encountered
case unsupportedHTTPMethod = 10002
}
/// The enumeration of the possible error codes in the Foundation error domain
@objc public class FoundationError: NSObject, CustomNSError {
/// The underlying error code
private let code: FoundationErrorCode
/// The domain of the error.
public static var errorDomain: String {
return "FoundationError"
}
/// The error code within the given domain.
public var errorCode: Int {
return code.rawValue
}
/// The user-info dictionary.
public let errorUserInfo: [String : Any]
/// Initializes a new FoundationError with an empty userInfo dictionary
///
/// - parameter code: one of the available error codes
///
/// - returns: a new instance of FoundationError
public convenience init(code: FoundationErrorCode) {
self.init(code: code, userInfo: [:])
}
/// Initializes a new FoundationError with an userInfo dictionary
///
/// - parameter code: one of the available error codes
/// - parameter userInfo: the user-info dictionary
///
/// - returns: a new instance of FoundationError
public init(code: FoundationErrorCode, userInfo: [String : Any]) {
self.code = code
errorUserInfo = userInfo
}
/// Computes whether two FoundationErrors are equal
///
/// - parameter object: a FoundationError
///
/// - returns: true, if the two errors are equal
public override func isEqual(_ object: Any?) -> Bool {
guard let object = object as? FoundationError else { return false }
return errorCode == object.errorCode && errorUserInfo.keys.elementsEqual(object.errorUserInfo.keys)
}
}
I hope this is closer to the correct way to implement this.
Thanks!
Ronak
> On Sep 29, 2016, at 1:17 PM, Ronak via swift-users <swift-users at swift.org> wrote:
>
> Hello all,
>
> We are proceeding to update all of our Swift code to Swift 3 now and had a few questions about the proper way to implement Errors. We need these entities to be available in Objective-C and they are actively being used in Swift classes marked as @objc.
>
> I read: https://github.com/apple/swift-evolution/blob/master/proposals/0112-nserror-bridging.md <https://github.com/apple/swift-evolution/blob/master/proposals/0112-nserror-bridging.md> completely and came up with this implementation:
>
>
> /// The enumeration of the possible error codes in the Foundation error domain
> @objc public class FoundationError: NSObject, CustomNSError {
>
> /// The underlying error code
> private let code: FoundationError.Code
>
> /// The type of an error code.
> @objc public enum Code: Int {
>
> /// An ARCOperationCondition failed during evaluation
> case operationConditionFailed = 10000
>
> /// An ARCOperation failed during execution
> case operationExecutionFailed = 10001
> }
>
> /// The domain of the error.
> public static var errorDomain: String {
> return "FoundationError"
> }
>
> /// The error code within the given domain.
> public var errorCode: Int {
> return code.rawValue
> }
>
> /// The user-info dictionary.
> public let errorUserInfo: [String : Any]
>
> /// Initializes a new FoundationError with an empty userInfo dictionary
> ///
> /// - parameter code: one of the available error codes
> ///
> /// - returns: a new instance of FoundationError
> public convenience init(code: FoundationError.Code) {
> self.init(code: code, userInfo: [:])
> }
>
> /// Initializes a new FoundationError with an userInfo dictionary
> ///
> /// - parameter code: one of the available error codes
> /// - parameter userInfo: the user-info dictionary
> ///
> /// - returns: a new instance of FoundationError
> public init(code: FoundationError.Code, userInfo: [String : Any]) {
> self.code = code
> errorUserInfo = userInfo
> }
>
> /// Computes whether two FoundationErrors are equal
> ///
> /// - parameter object: a FoundationError
> ///
> /// - returns: true, if the two errors are equal
> public override func isEqual(_ object: Any?) -> Bool {
> guard let object = object as? FoundationError else { return false }
>
> return errorCode == object.errorCode && errorUserInfo.keys.elementsEqual(object.errorUserInfo.keys)
> }
> }
>
> My question is whether this is the correct way to do this now; or is there another solution we should be doing? We would like to follow Swift Best Practices here, but unfortunately, the documentation is quite vague on this subject.
>
>
> Thanks for your help!
>
> Ronak Patel
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160929/d49e015a/attachment.html>
More information about the swift-users
mailing list