【问题标题】:Return Class based on Generic in SwiftSwift 中基于泛型的返回类
【发布时间】:2018-11-19 12:59:45
【问题描述】:

我有两个自定义类对象。我必须显示一个视图,该视图根据我们传递的类对象从两个对象中读取数据。

我怎样才能做到这一点?

谢谢,

【问题讨论】:

    标签: ios iphone swift generics


    【解决方案1】:

    您可以将您的 myObject 设置为 AnyObject,然后您可以检查对象是来自 A 类还是 B 类。

    class viewc : UIViewController {
        var myObject: AnyObject?
    
        override func viewDidLoad() {
            super.viewDidLoad()
            if let object = myObject as? ClassA {
                print("Object is of class- ClassA")
            }else if let object = myObject as? ClassB {
                print("Object is of class- ClassB")
            }
        }
    }
    

    【讨论】:

    • 您好,感谢您的回答,但我无法使用 AnyObject 定义 myObject,它必须仅定义为 A 或 B
    • 你用的是哪个版本的swift?
    • 我使用的是 swift 4.0
    【解决方案2】:

    您不能像 var object = <T>() 那样做,因为它的格式不正确,或者像 var object = T() 因为非标称类型 'T' 不支持显式初始化。

    你可以这样使用它:-

    class ABC<T>: UIViewController{
    
        var object: T? = nil
    }
    

    希望对你有帮助:)

    【讨论】:

    • 但我认为T也需要定义,不是吗?因为 T 只能是 A 或 B,没有别的
    • 不,当你调用这个控制器时,你需要像我们在泛型中那样在参数中传递它,比如:- ABC 或 ABC
    • 这对我没用,我必须说它类型 A 或 B ,否则我的代码将用于解析数据。
    • 如果它只有两种类型,那么你不需要使用泛型,你可以通过使用变量来键入AnyObject。
    • 但是我已经使用 A 类对象来分析数据了。但是现在我必须使用 B 类对象进行解析,两者都接近相似所以我不能使用 AnyObject。
    【解决方案3】:

    您可以使用泛型类型。

    class ControllerTimeline<T>: UIViewController {
    
        var myObject :T?
        ...
    }
    

    如果你需要 T 有一些约束(例如:可能只是 NSObject)

    class ControllerTimeline<T: NSObject>: UIViewController {
    
        var myObject :T?
        ...
    }
    

    如果您只想使用 A 或 B,您可以为 A 和 B+ 创建一个公共父级

    class ControllerTimeline<T: C>: UIViewController {
    ...
    

    或者让 A 和 B 实现一个通用的协议,然后输入类似这样的东西

    class ControllerTimeline<T: MyProtocol>: UIViewController {
    ...
    

    【讨论】:

    • 但是我觉得T也是需要定义的,不是吗?
    • 这是使用泛型的核心,'T' 是一个占位符类型名称,并没有说明 T 必须是什么。
    • 但我不得不说T只能是A或B,否则我无法解析。
    • 如果你需要一些类型约束,让A和B符合一个协议,然后添加一个类型约束类ViewController
    • 你能举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多