在不同类中使用函数的最佳实践

时间:2016-09-12 08:58:15

标签: swift function inheritance

我是swift和编程的新手。我正在一个项目中工作,我必须处理从Landscape到Protrait的方向变化,反之亦然。每次方向改变时我都要改变不同变量的值,比如NSLayoutconstraint,字体大小......我在函数中写了这个改变

func updateValuesForAppropriateOrientations ()
{

  if ipadPortrait()
  {
  //update variables for ipad portrait
  }
  else if ipadLandscape()
  {
  //update variables for ipad landscape
  }

{

一切正常,但我在很多不同的ViewControllers中使用这个函数,我每次都在重写它。这是正确的方法,还是我应该使用继承?但是每个ViewController中的变量都不同,所以我不知道继承如何帮助。什么是最佳实践,如何使我的代码更清洁是我的问题。

2 个答案:

答案 0 :(得分:1)

我认为现在鼓励我们这样做的方法是使用viewWillTransitionToSize:withTransitionCoordinator:方法。这是所有UIViewControllers都遵守的UIContentContainer协议的一部分。不要考虑屏幕方向,而是应该指示视图控制器在根视图大小设置为更改时采取操作。至于你必须为项目中的每个视图控制器重写函数,这对于需求是多余的,因为viewWillTransitionToSize会自动调用可能与viewController有关的任何更改。希望有所帮助。

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIContentContainer_Ref/

的详细信息

答案 1 :(得分:0)

如果使所有变量具有相同的名称,则可以通过默认协议实现注入通用功能。

一个例子:

protocol Rotatable {
    var height: Int { get set }
    var width: Int { get set }
    mutating func rotate()
}

extension Rotatable {
    mutating func rotate() {
        let temp = height
        height = width
        width = temp
    }
}

class Foo {
    var height = 1
    var width = 2
}

struct Bar {
    var height = 10
    var width = 20
}

extension Foo: Rotatable { }
extension Bar: Rotatable { }

var foo = Foo()
var bar = Bar()

print("Foo is \(foo.height)x\(foo.width)") // Foo is 1x2
print("Bar is \(bar.height)x\(bar.width)") // Bar is 10x20

foo.rotate()
bar.rotate()

print("Foo is \(foo.height)x\(foo.width)") // Foo is 2x1
print("Bar is \(bar.height)x\(bar.width)") // Bar is 20x10