Swift类型(:)函数签名

时间:2017-01-13 21:22:58

标签: swift swift3

我正在尝试实现返回值类型的简单名称的函数:

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 docssource 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 }}"/> 的任何信息(功能签名)。

2 个答案:

答案 0 :(得分:3)

即使看起来type(of:)不是函数,编译器也会将其静态处理为Dynamic Type Expression。因此,您可以在调用super.init之前使用它。

使用您的自定义函数,编译器并不知道您实际上并未使用该值,因此它无法允许该调用。

答案 1 :(得分:1)

  

此外,我找不到关于type(of:)

的任何信息(功能签名)

因为它不是标准库定义的函数。它是原语,即它是语言的一部分。正如最初的发行说明所表达的那样:

  

新的原始函数type(of:)已添加到语言 [强调我的]

您几乎可以将其视为运营商。 (事实上​​,正如原始proposal中所建议的那样,这是它的创造的全部要点。)