gpt4 book ai didi

swift - 在方法中使用类作为泛型类型参数

转载 作者:行者123 更新时间:2023-11-28 11:58:17 24 4
gpt4 key购买 nike

我正在使用以下通用方法返回子类

class SomeClass {

var childInstance: ParentClass?

func getClass<T: ParentClass>() -> T? {
return childInstance as? T
}

func usage() {
if let view: ChildTwo = self.getClass() {
view.someMethodOfClassTwo()
}
}
}

是否可以将类作为泛型类型参数传递?所以用法是没有 if 语句,像这样:

self.getClass(type: ChildTwo)?.someMethodOfClassTwo()

上面使用的父/子类如下:

class ParentClass { }
class ChildOne: ParentClass {
func someMethodOfClassOne() { }
}
class ChildTwo: ParentClass {
func someMethodOfClassTwo() { }
}

更新:ParentClass 是一个类,出于某种原因我无法使用协议(protocol)或将其更改为协议(protocol)。

最佳答案

是的,你可以。但我很困惑你将如何使用它。

您需要稍微修改您的 getClass<T: ParentClass>() -> T? 的签名功能。我也故意更改了函数的名称,因为将名称命名为 getClass 是没有意义的。您实际上在哪里获得子实例。

class SomeClass {

var childInstance: ParentClass?

func getChild<T: ParentClass>(type: T.Type) -> T? {
return childInstance as? T
}

func usage() {
if let child = self.getChild(type: ChildTwo.self) {
child.someMethodOfClassTwo()
}
}
}

同样,您可以在没有 if-let 的情况下使用它也有约束力。但是你必须处理 optional chaining :

SomeClass().getChild(type: ChildTwo.self)?.someMethodOfClassTwo()

这里有 ParentClass作为一个类,当你传递一个实际上没有多大意义的通用类类型时,你会得到自动完成: ParentClass as class


编辑:

如果将设计稍微修改为 ParentClass成为Parent协议(protocol),那么 Xcode 自动补全会建议你更有意义的签名。见:

protocol Parent { }
class ChildOne: Parent {
func functionOfChildOne() { }
}
class ChildTwo: Parent {
func functionOfChildTwo() { }
}

class SomeClass {

var childInstance: Parent?

func getChild<T: Parent>(type: T.Type) -> T? {
return childInstance as? T
}

func usage() {
if let child = self.getChild(type: ChildTwo.self) {
child.functionOfChildTwo()
}
}
}

Xcode 自动完成建议您传递符合 Parent 的类型协议(protocol) Parent as protocol

关于swift - 在方法中使用类作为泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516963/

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