致命错误:对 Swift 类使用未实现的初始化程序 'init()' [英] Fatal error: Use of unimplemented initializer 'init()' for class Swift

查看:28
本文介绍了致命错误:对 Swift 类使用未实现的初始化程序 'init()'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 [MarkdownTextView][1] 将基本降价添加到 UITextView.TextViewMarkdownTextView 的子类.

I am using [MarkdownTextView][1] to add basic markdown to a UITextView. The TextView is a subclass of MarkdownTextView.

但是在使用复制和粘贴时出现以下错误

However when using copy and paste I get the following error

致命错误:对类使用未实现的初始化程序init()"标记文本存储

Fatal error: Use of unimplemented initializer 'init()' for class MarkdownTextStorage

这就是我在 ViewController 中使用 TextStorage 的方式

This is how I use the TextStorage in my ViewController

let fonty = UIFont(name: font, size: fsize)
    
attributes.defaultAttributes[NSFontAttributeName] = fonty
attributes.orderedListAttributes?[NSFontAttributeName] = fonty
attributes.orderedListItemAttributes?[NSFontAttributeName] = fonty
attributes.unorderedListAttributes?[NSFontAttributeName] = fonty
attributes.unorderedListItemAttributes?[NSFontAttributeName] = fonty

let textStorage = MarkdownTextStorage(attributes: attributes)
    
do {
   textStorage.addHighlighter(try LinkHighlighter())
} catch let error {
    fatalError("Error initializing LinkHighlighter: \(error)")
}
   textStorage.addHighlighter(MarkdownStrikethroughHighlighter())
   textStorage.addHighlighter(MarkdownSuperscriptHighlighter())
    
if let codeBlockAttributes = attributes.codeBlockAttributes {
        textStorage.addHighlighter(MarkdownFencedCodeHighlighter(attributes: codeBlockAttributes))
 }

我使用了以下初始化程序,但仍然没有运气

I have used the following initialiser but still have no luck

required public init?(coder aDecoder: NSCoder) {
    attributes = MarkdownAttributes()
    super.init(coder: aDecoder)
    commonInit()
}

这是该类的完整源代码

open class MarkdownTextStorage: HighlighterTextStorage {

fileprivate let attributes: MarkdownAttributes

// MARK: Initialization

/**
Creates a new instance of the receiver.

:param: attributes Attributes used to style the text.

:returns: An initialized instance of `MarkdownTextStorage`
*/
public init(attributes: MarkdownAttributes = MarkdownAttributes()) {
    self.attributes = attributes
    super.init()
    commonInit()
    
    if let headerAttributes = attributes.headerAttributes {
        addHighlighter(MarkdownHeaderHighlighter(attributes: headerAttributes))
    }
    addHighlighter(MarkdownLinkHighlighter())
    addHighlighter(MarkdownListHighlighter(markerPattern: "[*+-]", attributes: attributes.unorderedListAttributes, itemAttributes: attributes.unorderedListItemAttributes))
    addHighlighter(MarkdownListHighlighter(markerPattern: "\\d+[.]", attributes: attributes.orderedListAttributes, itemAttributes: attributes.orderedListItemAttributes))
    
    // From markdown.pl v1.0.1 <http://daringfireball.net/projects/markdown/>
    
    // Code blocks
    addPattern("(?:\n\n|\\A)((?:(?:[ ]{4}|\t).*\n+)+)((?=^[ ]{0,4}\\S)|\\Z)", attributes.codeBlockAttributes)
    
    // Block quotes
    addPattern("(?:^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+", attributes.blockQuoteAttributes)
    
    // Se-text style headers
    // H1
    addPattern("^(?:.+)[ \t]*\n=+[ \t]*\n+", attributes.headerAttributes?.h1Attributes)
    
    // H2
    addPattern("^(?:.+)[ \t]*\n-+[ \t]*\n+", attributes.headerAttributes?.h2Attributes)
    
    // Emphasis
    addPattern("(\\*|_)(?=\\S)(.+?)(?<=\\S)\\1", attributesForTraits(.traitItalic, attributes.emphasisAttributes))
    
    // Strong
    addPattern("(\\*\\*|__)(?=\\S)(?:.+?[*_]*)(?<=\\S)\\1", attributesForTraits(.traitBold, attributes.strongAttributes))
    
    // Inline code
    addPattern("(`+)(?:.+?)(?<!`)\\1(?!`)", attributes.inlineCodeAttributes)
}

required public init?(coder aDecoder: NSCoder) {
    attributes = MarkdownAttributes()
    super.init(coder: aDecoder)
    commonInit()
}

fileprivate func commonInit() {
    defaultAttributes = attributes.defaultAttributes
}

// MARK: Helpers

fileprivate func addPattern(_ pattern: String, _ attributes: TextAttributes?) {
    if let attributes = attributes {
        let highlighter = RegularExpressionHighlighter(regularExpression: regexFromPattern(pattern), attributes: attributes)
        addHighlighter(highlighter)
    }
}

private func attributesForTraits(_ traits: UIFontDescriptorSymbolicTraits, _ attributes: TextAttributes?) -> TextAttributes? {
    var attributes = attributes
    if let defaultFont = defaultAttributes[NSFontAttributeName] as? UIFont , attributes == nil {
        attributes = [
            NSFontAttributeName: fontWithTraits(traits, font: defaultFont)
        ]
    }
    return attributes
}

}

完整的错误截图

有人对如何解决问题有任何建议吗?

Does anyone have any suggestions on how to fix the issue ?

推荐答案

在堆栈跟踪和控制台输出中,您可以看到 Objective-C 端尝试不带参数调用初始化程序.

In the stack trace and console output you can see that the Objective-C side tries to call the initializer without arguments.

人们可能认为有一个提供了默认值参数,但这只会在 Swift 端工作,因为它没有暴露给 Objective-C 端.

One might think there is one supplied with default value parameter, but that would just work from Swift side, because it is not exposed to the Objective-C side.

因此,如果来自 Objective-C 背景的人可能会认为,初始化器可能是继承的.但 Swift 并非如此:

So if coming from an Objective-C background one might think, that the intializer might be inherited. But that's not the case with Swift:

初始化器继承和覆盖

与 Objective-C 中的子类不同,Swift 子类默认不继承其超类初始值设定项.

Unlike subclasses in Objective-C, Swift subclasses do not inherit their superclass initializers by default.

请参阅此处:https://docs.swift.org/swift-书/语言指南/Initialization.html

解决方案

因此,如果您提供一个没有参数的初始化程序,如下所示:

So if you supply an initializer without parameters like so:

public override convenience init() {
    self.init(attributes: MarkdownAttributes())
}

那么它在从 Objective-C 端调用时也能工作.

then it works also when called from Objective-C side.

这篇关于致命错误:对 Swift 类使用未实现的初始化程序 'init()'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆