我正在尝试实现返回值类型的简单名称的函数:
func typeName(of value: Any) -> String {
return String(describing: type(of:value))
}
但是当我尝试在super.init
之前调用它时:
class SuperTest {
init(name: String) {
print(name)
}
}
class Test: SuperTest {
init() {
// super.init(name: String(describing: type(of: self)))
super.init(name: typeName(of: self))
}
}
Test()
它失败了:
在super.init call之前使用'self'
这对我来说是完全清楚的。
但是当我内联typeName(of:)
正文代码(注释行)时,它会编译并打印预期的“测试”结果。
为什么会发生这种魔法,如何在typeName(of:)
super.init()
type(of:)
之前使用type(of:)
?
此外,我在Swift docs或source code中找不到关于<Text
text="{path : 'list>embHeaderData/createdAt', type 'sap.ui.model.type.Date', formatOptions: { pattern: 'd-MMM-Y', source : { pattern : 'yyyy-MM-ddTH:m:s.SZ' }, UTC : true }}"
tooltip="{ path : 'list>embHeaderData/createdAt', type : 'sap.ui.model.type.DateTime', formatOptions: { pattern: 'd-MMM-Y HH:mm:ss', source : { pattern : 'yyyy-MM-ddTH:m:s.SZ' }, UTC : true }}"/>
<Text
text="{path : 'list>embProcessData/fromDate', type : 'sap.ui.model.type.Date', formatOptions: { pattern: 'd-MMM-Y', source : { pattern : 'yyyy-MM-ddZ' }, UTC : true }}"
tooltip="{path : 'embProcessData/fromDate', type : 'sap.ui.model.type.DateTime', formatOptions: { pattern: 'd-MMM-Y HH:mm:ss', source : { pattern : 'yyyy-MM-ddZ' }, UTC : true }}"/>
<Text
text="{path : 'list>embProcessData/toDate', type : 'sap.ui.model.type.Date', formatOptions: { pattern: 'd-MMM-Y', source : { pattern : 'yyyy-MM-ddZ' }, UTC : true }}"
tooltip="{path : 'embProcessData/toDate', type : 'sap.ui.model.type.DateTime', formatOptions: { pattern: 'd-MMM-Y HH:mm:ss', source : { pattern : 'yyyy-MM-ddZ' }, UTC : true }}"/>
的任何信息(功能签名)。
答案 0 :(得分:3)
即使看起来type(of:)
不是函数,编译器也会将其静态处理为Dynamic Type Expression。因此,您可以在调用super.init之前使用它。
使用您的自定义函数,编译器并不知道您实际上并未使用该值,因此它无法允许该调用。
答案 1 :(得分:1)
此外,我找不到关于
的任何信息(功能签名)type(of:)
因为它不是标准库定义的函数。它是原语,即它是语言的一部分。正如最初的发行说明所表达的那样:
新的原始函数
type(of:)
已添加到语言 [强调我的]
您几乎可以将其视为运营商。 (事实上,正如原始proposal中所建议的那样,这是它的创造的全部要点。)