我只是在阅读有关协议初始值设定项要求的 Apple Swift 4 文档并在协议扩展中提供默认实现。
import UIKit
protocol Protocol {
init()
}
extension Protocol {
init() {
print("SDf")
self.init() // Line 1
// Compiler error occured if this is omitted
//"'self.init' isn't called on all paths before returning from initializer"
}
}
struct Structure: Protocol {
init(string: String) {
}
}
Structure() // Line 2
Run Code Online (Sandbox Code Playgroud)
现在如您所见,执行将进入循环,因为默认情况下该结构没有实现 for init(),因此将调用提供的协议 init 并再次调用自身,因此进入无限循环.
现在,知道了这一点,如果我删除第 1 行,编译器就会给出错误。
Q. 为什么强制我self.init()在1号线使用,如何摆脱这种情况?
我总是会说不,但后来我从Semantic UI(和Fomantic UI)中发现了这段代码,这是一个非常流行的前端框架:
<h2 class="ui icon header">
<i class="settings icon"></i>
<div class="content">
Account Settings
<div class="sub header">Manage your account settings and set e-mail preferences.</div>
</div>
</h2>
Run Code Online (Sandbox Code Playgroud)
该代码让我觉得不寻常,原因有两个:(1)<i>标签已被重新用作图标的通用挂钩,(2) 该代码嵌套<div>在<h2>元素内部。我质疑第一个的语义和第二个的有效性。
现在我想这些代码可以在所有主要浏览器中运行,否则他们就不会使用它,但它看起来不太惯用。更重要的是,它有效吗?
注意:我在问题中使用了术语“块级元素”(每个人都理解),但正如MDN 文档指出的那样:
块级元素与内联元素的区别在 4.01 之前的 HTML 规范中使用。在 HTML5 中,这种二元区别被一组更复杂的内容类别所取代。虽然“内联”类别大致对应于短语内容的类别 ,但“块级”类别并不直接对应于任何 HTML5 内容类别,但“块级”和“内联”元素组合在一起对应于流程HTML5 中的内容 。
让我们说我有一个字符串:
str = "12345\56789"
Run Code Online (Sandbox Code Playgroud)
如何将字符串分成2个单词?
["12345","56789"]
Run Code Online (Sandbox Code Playgroud) character ×1
escaping ×1
fomantic-ui ×1
html ×1
ruby ×1
semantic-ui ×1
split ×1
string ×1
swift ×1