在什么情况下可以使用下面描述的方法?有人能提供一些有用的例子吗?

时间:2016-03-15 12:55:47

标签: swift

我在源代码的一部分中找到了以下方法,我无法理解Self.TypeSelf.Type.Type

之间的区别
property SomeProperty {
    static func type() -> Self.Type.Type {
        return self.dynamicType
    }
}

也许有人可以给我一些见解?

上面的代码段来自以下扩展名:

extension Property {
    static func size() -> Int {
        return Int(ceil(Double(sizeof(self))/Double(sizeof(Int))))
    }

    static func type() -> Self.Type.Type { return self.dynamicType }

    mutating func codeInto(pointer: UnsafePointer<Int>) { 
        (UnsafeMutablePointer(pointer) as
            UnsafeMutablePointer<Self>).memory = self
    }

    mutating func codeOptionalInto(pointer: UnsafePointer<Int>) { 
        (UnsafeMutablePointer(pointer) as
            UnsafeMutablePointer<Optional<Self>>).memory = self
    }
}

1 个答案:

答案 0 :(得分:2)

我怀疑原作者误解了static如何与self和子类一起使用。他们可能最初写这篇文章,打算返回这个特定子类的类型:&#34;

protocol TypeReturning {}

extension TypeReturning {
    static func type() -> Self.Type {
        return self.dynamicType
    }
}

错误是dynamicType在这里并没有什么意义。由于static上下文,self 的动态类型。但是作者会收到错误:

  

错误:无法转换类型&#39; Self.Type.Type&#39;的返回表达式返回类型&#39; Self.Type&#39;

我认为他们读了那个错误并想到了#啊;啊!我的退货类型错了&#34;他们修好了:

static func type() -> Self.Type.Type {
    return self.dynamicType
}

正确的解决方案是:

static func type() -> Self.Type {
    return self
}

虽然更好的解决方案可能是完全避免这种情况;这是一项不必要的功能。它们只是意味着SomeClass.self,应该这样写。

.Type.Type很有意义。它是元类型(类型本身的类型)。但我不知道你能用它做什么。类型不是Swift中的第一类对象。