对所有班级

时间:2016-11-14 11:56:36

标签: ios swift

我有课程

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 PeopleUnderAge People等。那么我如何才能使警察局的方法investigateAnyOne对AnyObject采取行动没有TypeCasting。这可能吗?

向10-12个类的每个类型的对象进行向下转换会使代码变得混乱。我应该创建多个if else语句来检查类的类型或符合协议的任何其他方式。

问题是,如果还有很多其他类型的人想要投资,我应该怎么做..

3 个答案:

答案 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定义角色枚举以及包含nameage作为关联值的结构。

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")
    }
  }
}