HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – “无法覆盖已标记为不可用的’init’”可防止覆盖空init大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一种情况,我试图覆盖NSError,为我提供一个错误的实例,我将重新使用很多.

我的代码工作,直到我更新Xcode并转换为Swift 2.

public class NAUnexpectedResponseTypeError: NSError {
    public convenience init() {
        let messasge = "The object fetched by AFNetworking was not of an expected type."
        self.init(
            domain: "MyDomain",code: 6782,userInfo: [NSLocalizedDescriptionKey: messasge]
        )
    }
}

编译器说不能覆盖已标记为不可用的’init’.通过这样做,我能够破解它:

public class NAUnexpectedResponseTypeError: NSError {
    public class func error() -> NSError {
        let message = "The object fetched by AFNetworking was not of an expected type."
        return NAUnexpectedResponseTypeError(
            domain: "MyDomain",userInfo: [NSLocalizedDescriptionKey: message]
        )
    }
}

所以,我的问题是:

>有没有办法在这种情况下添加一个空的init方法
>如果是1,那么出于某种原因这是个坏主意吗?
>使用类方法解决方法是否是缓解此问题的适当方法

编辑:

我提出了另一种解决方法,我更喜欢使用类方法解决方法.我仍然不高兴我不能覆盖空的init方法.

public class NAUnexpectedResponseTypeError: NSError {
    public convenience init(message: String?) {
        var errormessage: String
        if let message = message {
            errormessage = message
        } else {
            errormessage = "The object fetched by AFNetworking was not of an expected type."
        }
        self.init(
            domain: "MyDomain",userInfo: [NSLocalizedDescriptionKey: errormessage]
        )
    }
}

解决方法

由于NSError是不可变的,因此没有理由创建相同数据的多个实例.只需创建一个单一的常量实例:

let NAUnexpectedResponseTypeError = NSError(domain: "MyDomain",userInfo: [NSLocalizedDescriptionKey: "The object fetched by AFNetworking was not of an expected type."]
)

如果你的情况不是常数,那么扩展而不是子类NSError几乎总是更好.例如:

extension NSError {
    class func MyError(code code:code,message: String) -> NSError {
        return NSError(domain: "MyDomain",code: code,userInfo: [NSLocalizedDescriptionKey: message])
   }
}

这种扩展(作为一个类别)在ObjC中有很长的历史,并且是一个很好的模式带给Swift(如果你不能轻易使用枚举ErrorTypes,它甚至更好的Swift).

在许多情况下,我发现为此设置顶函数更容易,而不是扩展NSError.例如:

private func makeError(code code:code,message: String) -> NSError {
    return NSError(domain: "MyDomain",userInfo: [NSLocalizedDescriptionKey: message])
}

(当我必须使用NSError时,我个人在Swift中一直使用这些函数.在ObjC中,我通常在NSError上使用类别.不知道为什么我改变了,但感觉更自然.)

大佬总结

以上是大佬教程为你收集整理的ios – “无法覆盖已标记为不可用的’init’”可防止覆盖空init全部内容,希望文章能够帮你解决ios – “无法覆盖已标记为不可用的’init’”可防止覆盖空init所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。