ios - 致命错误:对 Swift 类使用未实现的初始化程序“init()”
问题描述
我正在使用 [MarkdownTextView][1] 将基本降价添加到UITextView
. TextView
是 的子类MarkdownTextView
。
但是,当使用复制和粘贴时,我收到以下错误
致命错误:对 MarkdownTextStorage 类使用未实现的初始化程序“init()”
这就是我在 ViewController 中使用 TextStorage 的方式
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))
}
我使用了以下初始化程序,但仍然没有运气
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
}
}
完整错误截图
有没有人对如何解决这个问题有任何建议?
解决方案
在堆栈跟踪和控制台输出中,您可以看到 Objective-C 端尝试不带参数调用初始化程序。
有人可能会认为提供了一个默认值参数,但这只能在 Swift 端工作,因为它没有暴露给 Objective-C 端。
因此,如果来自 Objective-C 背景的人可能会认为,初始化程序可能会被继承。但 Swift 并非如此:
初始化器继承和覆盖
与 Objective-C 中的子类不同,Swift 子类默认不继承它们的超类初始化器。
见这里:https ://docs.swift.org/swift-book/LanguageGuide/Initialization.html
解决方案
因此,如果您提供一个没有参数的初始化程序,如下所示:
public override convenience init() {
self.init(attributes: MarkdownAttributes())
}
然后它在从 Objective-C 端调用时也可以工作。
推荐阅读
- c# - 一名开发人员;需要离线开发的统一 nuget
- reactjs - React 可以用 URL 填写页面信息吗?
- android - Hilt 正在将公共字段转换为私有字段并且无法注入
- reactjs - Formik & 是的 | 多文件上传验证
- maven - 嗨,我已经安装了 JDK 16.0.1 版本,并且在 eclipse 中我创建了一个 maven 项目,我想添加黄瓜依赖项
- java - 如何使用 Java 在 SQL 数据库中存储多维数组?
- javascript - Puppeteer - 找不到选择器的节点
- typescript - 如何 console.log 打字稿类型
- keyboard - 在没有管理员权限的情况下重新映射密钥
- python - IBM Db2 SQL Alchemy 适配器——客户端驱动程序问题