【问题标题】:Checking between inherited class and super检查继承类和超级类
【发布时间】:2018-05-03 02:30:12
【问题描述】:

我有一堂课:

class User: NSObject {
    var name = "User_Name"
    // Other variables and methods
}

以及从“用户”继承的第二个类:

class Employee: User {
    var job = "Manager"
    // other variables and methods
}

我希望能够在一个函数中检查两者之间的关系,并对它们采取稍微不同的行动。

我相信我可以在使用之前使用保护语句将“AnyObject”参数转换为可疑类型,但不知道如何在两种不同的类类型之间进行检查。例如,我相信我可以对一种类型执行以下操作:

func addUser(user : AnyObject) {
    guard let user = user as? User else {return}
        // do something with 'user' which is known to be of type 'User'
    }

但无法弄清楚如果发送的参数不是“用户”类型,如何检查它是否是员工。如果守卫语句评估为真,我想做非常相似的操作,无论它是用户还是员工,因此认为必须有一种方法可以在不重复代码的情况下做到这一点。

有人可以指出我在两种类型之间进行测试的正确方向吗?

【问题讨论】:

  • 不相关但你为什么要扩展NSObject?仅当您有明确且可理解的原因时才这样做。
  • 我认为在创建没有超类的新类时需要这样做?不是吗?你谈论的原因是什么?
  • @AlTopping 不,自定义类不需要从任何现有类继承,因此除非您明确需要其他类的某些功能,否则不要从它继承
  • 在 Objective-C 中,你必须有一个基类。但不是在 Swift 中。
  • 感谢所有cmets;你们俩都非常有帮助。铝

标签: swift generics inheritance casting


【解决方案1】:

使用AnyObject 很少是正确的方法。通常,当您希望根据输入参数的类型对同一函数进行特定实现时,您会希望实现一个通用函数。但是,由于您只需要您的函数处理具有相同超类的对象,因此您可以简单地使用超类作为输入参数类型,然后使用可选转换来查看参数实际上是否属于更具体的类型。

func addUser(user: User) {
    if let employee = user as? Employee {
        print(employee.job)
    } else {
        print(user.name)
    }
}

addUser(user: User()) //prints "User_Name"
addUser(user: Employee()) //prints "Manager"

对于这种简单的情况,不需要泛型函数,特别是因为在这种情况下,泛型函数与非泛型函数的形式几乎相同:

func addUser<T:User>(user: T){
    if let employee = user as? Employee {
        print(employee.job)
    } else {
        print(user.name)
    }
}

addUser(user: User()) //prints "User_Name"
addUser(user: Employee()) //prints "Manager"

或者,如果您想扩展它以处理不继承自 User 的类:

func addUser<T>(user: T){
    if let user = user as? User {
        if let employee = user as? Employee {
            print(employee.job)
        } else {
            print(user.name)
        }
    } else {
        print("Not a user")
    }
}

addUser(user: User()) //prints "User_Name"
addUser(user: Employee()) //prints "Manager"
addUser(user: "Me") //prints "Not a user"

【讨论】:

  • 大卫,这看起来很到位。但是,对于未来的信息,我将如何实现一个通用函数来做这种事情?
  • 也感谢大卫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
相关资源
最近更新 更多