检查继承的类和超级

时间:2017-11-19 21:53:13

标签: swift generics inheritance casting

我有一个班级:

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

和继承自'user'的第二个类:

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

我希望能够在一个函数中检查两者,并以稍微不同的方式对它们进行操作。

我相信在使用它之前我可以使用一个guard语句将我的'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'
    }

但是如果不是'User'类型,则无法弄清楚如何检查发送的参数是否为Employee。如果保护语句评估为真,我想做非常类似的操作,无论它是用户还是员工,所以认为必须有一种方法可以在不重复代码的情况下进行。

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

1 个答案:

答案 0 :(得分:0)

使用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"