我有课程
class Citizen{
var name:String
var age:Int
var lawPrevilige = 0
init(name:String,age:Int){
self.name = name
self.age = age
}
}
class Politician{
var name:String
var age:Int
var lawPrevilige = 1
init(name:String,age:Int){
self.name = name
self.age = age
}
}
还有一个操纵那些
的课程class PoliceDept{
var departMentName = "InterPol"
var departMentAddress:String = "Earth"
//this method should be able to access object of any class with the same properties.
func investigateAnyOne(person:AnyObject){
if let p = person as? Citizen{
print(p.name)
}else if let po = person as? Politician{
print(po.name)
}
}
}
现在的问题是,我是否有一个具有确切属性名称和年龄的班级Disabled People
,UnderAge People
等。那么我如何才能使警察局的方法investigateAnyOne
对AnyObject采取行动没有TypeCasting。这可能吗?
向10-12个类的每个类型的对象进行向下转换会使代码变得混乱。我应该创建多个if else语句来检查类的类型或符合协议的任何其他方式。
问题是,如果还有很多其他类型的人想要投资,我应该怎么做..
答案 0 :(得分:1)
创建Protocol
并定义其中的所有属性,并在所有类中符合公共Protocol
。所以你不需要在investigateAnyOne
中检查多个案例。
protocol Common {
var name:String {get set}
var age:Int {get set}
var lawPrevilige:Int {get set}
}
class Politician: Common{
var name:String
var age:Int
var lawPrevilige = 1
init(name:String,age:Int){
self.name = name
self.age = age
}
}
class PoliceDept{
var departMentName = "InterPol"
var departMentAddress:String = "Earth"
func investigateAnyOne(person: Common){
self.departMentName = person.name
}
}
创建Politician
的对象,并将其传递给investigateAnyOne
方法。
let politician = Politician(name: "demo", age: 10)
let policeDept = PoliceDept()
policeDept.investigateAnyOne(politician)
答案 1 :(得分:1)
您可以使用枚举来定义人的各种角色,并将其作为属性分配给一般的Person结构,如下所示。
Internal Server Error
您可以在此代码中使用enum Priviledge {
case citizen
case politician
case underage
}
struct Person {
let name: String
let age: Int
let priviledge: Priviledge
init(name: String, age: Int, priviledge: Priviledge) {
self.name = name
self.age = age
self.priviledge = priviledge
}
}
struct PoliceDept {
...
func investigateAnyOne(person: Person) {
switch (person.priviledge) {
case .citizen:
print("\(person.name) is a citizen")
case .politician:
print("\(person.name) is a politician")
case .underage:
print("\(person.name) is a child")
}
}
}
代替class
,但我正在恢复OOP-aholic。
答案 2 :(得分:1)
另一种方法是使用Person
定义角色枚举以及包含name
和age
作为关联值的结构。
struct Details {
let name: String
let age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
enum Person {
case citizen(Details)
case politician(Details)
case underage(Details)
}
struct PoliceDept {
...
func investigateAnyOne(person: Person) {
switch (person) {
case .citizen(let details):
print("\(details.name) is a citizen")
case .politician(let details):
print("\(details.name) is a politician")
case .underage(let details):
print("\(details.name) is a child")
}
}
}