2017-06-09 22 views
1

我有两个视图控制器(A和B)都具有相同的逻辑写入相同功能的两个视图控制器:怎样避免使用子类和/或委托模式(SWIFT)

class A: UIViewController { 

    override func viewDidAppear(_ animated: Bool) { 

     self.contrast(first: nil, second: self.numberOne) 
      timer = Timer.scheduledTimer(timeInterval: 0.7, target: self, selector: #selector(update), userInfo: nil, repeats: true) 


    } 

    @objc private func update() { 

     if count == 0 { 
      self.contrast(first: self.numberOne, second: self.numberTwo) 
    } else if count == 1 { 
      self.contrast(first: self.numberTwo, second: self.numberThree) 

    } else if count == 2 { 
      self.contrast(first: self.numberThree, second: self.numberFour) 
    } else if count == 3 { 
      self.contrast(first: self.numberFour, second: nil) 
      self.timer.invalidate() 
    } 

    self.count += 1 
} 
} 

class B: UIViewController { 


    override func viewDidAppear(_ animated: Bool) { 

     self.contrast(first: nil, second: self.numberOne) 
     timer = Timer.scheduledTimer(timeInterval: 0.7, target: self, selector: #selector(update), userInfo: nil, repeats: true) 
    } 

    @objc private func update() { 

    if count == 0 { 
     self.contrast(first: self.numberOne, second: self.numberTwo) 
} else if count == 1 { 
     self.contrast(first: self.numberTwo, second: self.numberThree) 

} else if count == 2 { 
     self.contrast(first: self.numberThree, second: self.numberFour) 
} else if count == 3 { 
     self.contrast(first: self.numberFour, second: nil) 
     self.timer.invalidate() 
} 

self.count += 1 
     } 

    } 

正如你可以看到他们都使用完全相同的代码。我试图用UIViewController的扩展来解决它,但事情有点混乱。然后我听说了委托模式,但是我找不到与此场景相关的任何示例!

编辑:viewDidAppear方法也完全相同。如果以某种方式我可以覆盖超类的?

+1

您应该使用开关计数而不是使用多个其他的 –

+0

这是*所有*两个视图控制器的代码?如果是这样,那么为什么需要两个单独的类? 'ClassA' *已经是'UIViewController'的子类,并且只是实例化'ClassA'的两个实例(或者设置IB的类)。 – dfd

+1

- >子分类:您可以从UIViewController创建类say myClass,并将其用作类A和B的超类,并在myClass中使用白色常用业务逻辑并调用该方法 –

回答

1

实际上,有几种方法可以避免重复代码。问题是你应该知道这些类的逻辑以及它们如何相互关联以决定如何实现它们。

首先,这两个类是完全一样的。你在这些类中有不同的代码吗?如果不是,你不需要2个相同的课程,只需要留下1个课程。

如果是,则取决于每个类实现哪个其他代码。例如,如果您的B类应该与A类完全相同并继承其所有功能,但也添加了一些新功能,那么它看起来像B类是A类的子类。

classA: UIViewController { 
    override func viewDidAppear(_ animated: Bool) { 
     self.contrast(first: nil, second: self.numberOne) 
     timer = Timer.scheduledTimer(timeInterval: 0.7, target: self, selector: #selector(update), userInfo: nil, repeats: true) 
    } 

    @objc private func update() { 
     if count == 0 { 
      self.contrast(first: self.numberOne, second: self.numberTwo) 
     } else if count == 1 { 
      self.contrast(first: self.numberTwo, second: self.numberThree) 
     } else if count == 2 { 
      self.contrast(first: self.numberThree, second: self.numberFour) 
     } else if count == 3 { 
      self.contrast(first: self.numberFour, second: nil) 
      self.timer.invalidate() 
     } 
     self.count += 1 
    } 
} 

classB: classA { 
    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     addNewFeatures() 
    } 

    func addNewfeatures { 
     //some additional code 
    } 
} 

如果两个类是不同的,而不是彼此相关的像父子,你可以在某些协议转向共同的行为,通过扩展添加默认实现该协议,并表明你的类将执行这一协议。

protocol Contrasting { 
    func contrast(first:Int, second: Int) 
} 

extension Contrasting { 
    func contrast(first: Int, second: Int) { 
     //make contrast 
    } 
} 

classA: UIViewController, Contrasting { 
    override func viewDidAppear(_ animated: Bool) { 
     contrast(first: nil, second: self.numberOne) 
    } 
} 

classB: UIViewController, Contrasting { 
    override func viewDidAppear(_ animated: Bool) { 
     contrast(first: nil, second: self.numberOne) 
    } 
} 

https://krakendev.io/blog/subclassing-can-suck-and-heres-why阅读本教程以了解何时使用继承和协议。

请在使用数字时使用开关以避免大量其他语句。

switch count { 
    case 0: 
     self.contrast(first: self.numberOne, second: self.numberTwo) 
    case 1: 
     self.contrast(first: self.numberTwo, second: self.numberThree) 
    case 2: 
     self.contrast(first: self.numberThree, second: self.numberFour) 
    case 3: 
     self.contrast(first: self.numberFour, second: nil) 
    default: 
     break 
} 
+2

请在'1-3'之后删除'break'语句。 Swift的'switch' case *隐式地打破了。 – vadian

+0

@vadian哦,你是对的,对不起。我编辑了答案。谢谢! – iamirzhan