gpt4 book ai didi

generics - Swift 3,元类型问题中的 ".self"是否真的正确?

转载 作者:行者123 更新时间:2023-12-02 01:21:39 26 4
gpt4 key购买 nike

我有一个扩展可以沿着 View Controller 链向上走(甚至通过容器 View ,这非常方便)

public extension UIViewController   // go up to a certain class
{
public func above<T>(_ : T.Type)->(T)
{
var p:UIResponder = self
repeat { p = p.next! } while !(p is T)
return p as! T
}
}

(注意,Swift3 在​​ p.next 上需要“!”:不幸的是,我不确定具体原因。)

因此,假设您有一个 View Controller 类“General”,您可以

self.above(General).clickedHamburgerMenuButton()

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

Missing '.self' for reference to metatype of type 'General'

好像是想要这个

self.above(General.self).clickedHamburgerMenuButton()

1) 将 General 更改为 General.self 似乎...很危险...实际上它是否安全并且的含义相同 在 Swift <3 中作为 General ?

2) 在扩展中

    public func above<T>(_ : T.Type)->(T)

为什么这是元类型?我是不是“做错了什么”让它请求元类型而不仅仅是类型?

2) “元类型”到底是什么? (我真的无法在任何地方找到这样的解释。)也就是说,除了“类本身”之外,“一般”可能意味着什么。 (不是实例,也不是静态实例,或其他任何东西......)

最佳答案

(Aside, NB, Swift3 needs the "!" on p.next: unfortunately I'm not sure exactly why.)

因为 .next 返回一个 Optional,但是 p 不是可选的。如果响应者用完,这将崩溃。

1) It seems ... dangerous ... to change General to General.self - in fact is it safe and is the meaning the same as General in Swift <3 ?

我很惊讶在没有 .self 的 Swift 早期版本中工作,但是是的,需要 .self 才能直接引用元类型。引用元类型在 Swift 中很少见,如果无意中引用元类型可能会导致令人惊讶的行为,因此需要额外的语法来说“是的,我的意思是类型。”

why is that a metatype? Did I "do something wrong" and make it ask for a metatype rather than just a type?

你做对了。

2) What the hell is a "metatype"?

类型的类型。元类型的实例是一种类型。考虑:

func f(x: Int)

要调用它,您需要传递 Int 的实例。如此相似:

func f<T>(x: T.Type)

要调用它,您需要传递一个元类型 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 }))
}
}

然后获取与类型匹配的下一个响应者是更清晰的 IMO(并且适用于任何响应者链):

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()

关于generics - Swift 3,元类型问题中的 ".self"是否真的正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39835397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com