美文网首页
Swift那些协议 (一)

Swift那些协议 (一)

作者: 木兮_君兮 | 来源:发表于2018-06-21 15:59 被阅读13次

CustomDebugStringConvertible

//standard description
public protocol CustomDebugStringConvertible {

    /// A textual representation of this instance, suitable for debugging.
    ///
    /// Calling this property directly is discouraged. Instead, convert an
    /// instance of any type to a string by using the `String(reflecting:)`
    /// initializer. This initializer works with any type, and uses the custom
    /// `debugDescription` property for types that conform to
    /// `CustomDebugStringConvertible`:
    ///
    ///     struct Point: CustomDebugStringConvertible {
    ///         let x: Int, y: Int
    ///
    ///         var debugDescription: String {
    ///             return "(\(x), \(y))"
    ///         }
    ///     }
    ///
    ///     let p = Point(x: 21, y: 30)
    ///     let s = String(reflecting: p)
    ///     print(s)
    ///     // Prints "(21, 30)"
    ///
    /// The conversion of `p` to a string in the assignment to `s` uses the
    /// `Point` type's `debugDescription` property.
    public var debugDescription: String { get }
}

//使用例子 这里借鉴的是PromiseKit 框架的源码
extension PMKError: CustomDebugStringConvertible {
    public var debugDescription: String {
        switch self {
        case .flatMap(let obj, let type):
            return "Could not `flatMap<\(type)>`: \(obj)"
        case .compactMap(let obj, let type):
            return "Could not `compactMap<\(type)>`: \(obj)"
        case .invalidCallingConvention:
            return "A closure was called with an invalid calling convention, probably (nil, nil)"
        case .returnedSelf:
            return "A promise handler returned itself"
        case .badInput:
            return "Bad input was provided to a PromiseKit function"
        case .cancelled:
            return "The asynchronous sequence was cancelled"
        case .emptySequence:
            return "The first or last element was requested for an empty sequence"
        }
    }
}

LocalizedError

/// Describes an error that provides localized messages describing why
/// an error occurred and provides more information about the error.
public protocol LocalizedError : Error {

    /// A localized message describing what error occurred.
    public var errorDescription: String? { get }

    /// A localized message describing the reason for the failure.
    public var failureReason: String? { get }

    /// A localized message describing how one might recover from the failure.
    public var recoverySuggestion: String? { get }

    /// A localized message providing "help" text if the user requests help.
    public var helpAnchor: String? { get }
}

//Usage(用法)
extension PMKError: LocalizedError {
    public var errorDescription: String? {
        return debugDescription
    }
}

总结:

  1. 什么情况下使用?

当我们写一个框架的时候,我们自定义一个错误的时候,我们需要自定义。CustomDebugStringConvertible 是对错误的描述,我们需要抛出错误还是需要用Error抛出,Error的抛出错误描述如果需要用到上面的自定义错误描述,我们就可以如上面一般使用。conform localizedError protol ,and then rewrite errorDescription.

  1. 怎么使用?

如上,两个代码块连起来就OK了

相关文章

网友评论

      本文标题:Swift那些协议 (一)

      本文链接:https://www.haomeiwen.com/subject/cctcyftx.html