Generics 斯威夫特3号,是一个;。“自我”;在一个元类型问题上是否正确?

Generics 斯威夫特3号,是一个;。“自我”;在一个元类型问题上是否正确?,generics,swift3,metatype,Generics,Swift3,Metatype,我有一个扩展来遍历视图控制器链(甚至通过容器视图,这非常方便) 它会在你上方找到第一个“将军”。一切正常,但使用Swift 3,您将收到此警告 缺少对“General”类型的元类型的引用的“.self” 它似乎想要这个 self.above(General.self).clickedHamburgerMenuButton() 1) 似乎。。。危险的将General更改为General.self——事实上,它是安全的,与Swift(T)中的General意思相同吗 为什么这是一个元类型?我是否

我有一个扩展来遍历视图控制器链(甚至通过容器视图,这非常方便)

它会在你上方找到第一个“将军”。一切正常,但使用Swift 3,您将收到此警告

缺少对“General”类型的元类型的引用的“.self”

它似乎想要这个

self.above(General.self).clickedHamburgerMenuButton()
1) 似乎。。。危险的将
General
更改为
General.self
——事实上,它是安全的,与Swift(T)中的
General
意思相同吗 为什么这是一个元类型?我是否“做错了什么”并让它要求一个元类型而不仅仅是一个类型

2) 什么是“元类型”?(实际上,我在任何地方都找不到这样的解释。)也就是说,除了“类本身”之外,“一般”在那里可能意味着什么。(不是实例、静态实例或任何其他…)

(顺便说一句,注意,Swift3需要在第二页加上“!”。不幸的是,我不知道确切的原因。)

因为
.next
返回可选的,但是
p
不是可选的。如果您没有响应程序,则此程序将崩溃


1) 似乎。。。危险的将General改为General.self-事实上,它是安全的,并且在Swift中的含义与General相同。对于单参数函数,self是Swift 3之前的一个错误,请参阅。另请参见为什么需要
.self
。关于元类型的信息,:)。在您的示例中,
T.Type
是元类型Thank@Hamish,这是一个漂亮且信息密集的注释:)顺便说一句,您的方法当然可以在不强制展开的情况下编写,请注意,如果找不到匹配的响应程序,它将崩溃。您好@MartinR-谢谢。如果我曾经完全理解什么是“强制展开”,我将能够开始理解您的评论…-)thxTBC如果我不是tmistaken你的下一个响应者实际上返回了整个响应者链。。所有班级。(事实上,在那里使用递归。)然后,您的第一响应程序只需选择所有所需的类(flatMap)并返回其中的第一个(.first)。AwesomeYes,
nextResponders
延迟返回整个响应程序链(因此在请求它们之前,它不会实际计算整个链)。但它不是递归的<代码>序列是迭代的。哦,我明白了<代码>下一步:{$0.next}正在放入所有这些。。。野生的
self.above(General).clickedHamburgerMenuButton()
self.above(General.self).clickedHamburgerMenuButton()
    public func above<T>(_ : T.Type)->(T)
func f(x: Int)
func f<T>(x: T.Type)
public extension UIResponder {
    public func nextResponders() -> AnySequence<UIResponder> {
        guard let first = next else { return AnySequence([]) }
        return AnySequence(sequence(first: first, next: { $0.next }))
    }
}
public extension UIResponder {
    public func firstResponder<T: UIResponder>(ofType _: T.Type)-> T? {
        return nextResponders()
            .flatMap { $0 as? T }
            .first
    }
}

...

self.firstResponder(ofType: General.self)?.clickedHamburgerMenuButton()