Ios 作用于所有类的泛型方法

Ios 作用于所有类的泛型方法,ios,swift,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

我有自己的课程

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)
        }
    }
}
现在的问题是,如果我有一个类
残疾人
未成年人
等,具有确切的属性名称和年龄..那么我如何才能使方法
调查警察部门的一个人
在没有打字的情况下对任何对象采取行动。可能吗

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


问题是,如果有许多其他类型的人我想投资,我该怎么办?

制定一个
协议
,在那里定义所有属性,并在所有类别中遵守通用的
协议。因此,您无需在
调查中检查多个病例

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
  }
}
创建
political
的对象,并将其传递到
investigateAnone
方法中

let politician = Politician(name: "demo", age: 10)
let policeDept = PoliceDept()
 policeDept.investigateAnyOne(politician)

您可以使用枚举来定义人员的各种角色,并简单地将其作为属性分配给一般人员结构,如下所示

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
而不是
struct
,但我是一个正在恢复的OOP狂人。

另一种选择是使用
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")
    }
  }
}

一般情况下:普通超类
或协议但是:“政治家”和“残疾人”是不相交的类别吗?是的,他们目前并不相互依赖。如果我从UIKit类中有两个子类,这行得通吗。UtableViewCell?只有当您的类符合公共协议时,common outletsit才会起作用。您不能通过创建类对象来使用outlet,只能使用属性。