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,只能使用属性。