我有一个班级:
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。如果保护语句评估为真,我想做非常类似的操作,无论它是用户还是员工,所以认为必须有一种方法可以在不重复代码的情况下进行。
有人能指出我在两种类型之间进行测试的正确方向吗?
答案 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"