Swift和iOS良好做法#12中代码质量和简洁性的提示

 导入SomeExternalFramework 

FooViewController类:UIViewController,FoobarDelegate {

let foo:富

private let fooStringConstant =“ FooConstant”
私人让floatConstant = 1234.5

// MARK:生命周期

//自定义初始化程序转到此处

// MARK:查看生命周期

覆盖func viewDidLoad(){
super.viewDidLoad()
// ...
}

// MARK:布局

私人函数makeViewConstraints(){
// ...
}

// MARK:用户互动

func foobarButtonTapped(){
// ...
}

//标记:FoobarDelegate

func foobar(foobar:Foobar,didSomethingWithFoo foo:Foo){
// ...
}

// MARK:其他助手

私人功能displayNameForFoo(foo:Foo){
// ...
}

}
  • 如果您不打算对一个类进行子类化,请将其定为final
  • 对tableview进行两个扩展 (一个用于数据源,另一个用于委托方法)。
  • constant开头,如果需要更改,请使其为变量。
  • 如果仅在一个类/文件中使用它们,请将您的属性设为私有
  • 用于instantiateViewController或nib注册或更好地定义为常量的字符串重用标识符 ,并在需要时使用此常量。
  • 如果您有一个包含某些数据的类,则最好将其更改为struct not class,因为它提供的代码更少,“没有初始化器”,因此,如果以后创建实例,则无需构造器。

通过协议扩展减少重复代码

  • 我们可以在Objective-C中使用类别扩展现有的类型,但是没有对协议提供相同的功能。 Swift允许我们向协议添加功能。 使用Swift,我们可以扩展单个协议(甚至是标准库中的协议!),并将其应用于实现该协议的任何类。 协议扩展中有足够的原始能力,可以将我们的整个编程范例从面向对象更改为面向协议。 这个概念的实质是,我们默认通过协议(而不是类)添加功能,以使我们的代码更具可重用性。
  • 如果某些协议只能被类继承。 定义时继承类
  • 使习俗委派薄弱 。 弱引用不会对其引用的实例保持强力控制,因此也不会阻止ARC处置引用的实例。 而委托是一种设计模式,使类或结构可以将其某些职责移交给/委托给另一种类型的实例。 每当您在class B class A分配任何class A class B的委托时,您就在class B中保留class A class B的强引用,而class A也将class B class A的强引用作为委托。 因此,这将导致对象的保留周期与内存相关的问题。
 协议myCustomDelegation:类{ 
func newFunction(vaueToBeShare:字符串)
}
  A类{ 
弱var委托:myCustomDelegation?
//使代表变弱以打破保留周期
}
  B类:myCustomDelegation { 
内部函数newFunction(vaueToBeShare:String){
//当代表被解雇时在这里做一些事情
}
  let obj = A() //保持对类A的强引用 
 在里面() { 
obj.delegate = self //将A类分配给B类的委托
}
}
  • 尽可能避免使用力解包。 使用let守卫 let
  • 避免使用全局变量和函数。 请改用 扩展名 因为创建全局变量会使您的班级了解太多,所以您会松开SOLID原则的“首个责任”的首字母
 扩展Int { 
  var square:Int {return self * self} 
  } 
  3.square //打印:9 
  3.square.square //打印:81 
  • 任何项目结构的主要目的都是为开发人员提供一种简便的方法,使他们可以大致了解项目及其各个部分的功能,并能够快速找到并处理任何给定的组件,功能或类型,良好的结构还需要与项目一起不断发展。 代码转储基础的核心问题是我们创建的文件夹,文件或类型的范围太广 。 成功地打破一切都与平衡有关。 在改善组件或应用程序整体的结构时,一种有用的技术是按照其组成的功能对其进行分解。

使用功能来组织和组织项目的好处是,它可以像上面那样进行操作,因为它提供了一个很好的层次结构-而不是在顶层具有View ControllersModels之类的文件夹(因为这些文件夹会很快冒风险成为垃圾场)。

iOS最佳做法

保持常量的范围尽可能小。 例如,当您只需要在一个类中使用它时,它应该位于该类中。 那些需要真正在整个应用程序范围内的常量应该放在一个地方。 在Swift中,您可以使用Constants.swift文件中定义的枚举以一种干净的方式对应用范围内的常量进行分组,存储和访问:

 枚举Config { 
静态让baseURL = NSURL(string:“ http://www.example.org/”)!
静态让splineReticulatorName =“ foobar”
}

枚举颜色{
静态让primaryColor = UIColor(红色:0.22,绿色:0.58,蓝色:0.29,阿尔法:1.0)
静态让secondaryColor = UIColor.lightGray

//在代码文件中定义颜色的一种直观方法是使用#colorLiteral
//此语法将在代码行上为您提供颜色选择器组件
static let tertiaryColor = #colorLiteral(红色:0.22,绿色:0.58,蓝色:0.29,阿尔法:1.0)
}

数据存储

如果您的应用程序需要存储敏感数据,例如用户名和密码,身份验证令牌或一些个人用户详细信息,则需要将它们保存在无法从应用程序外部访问的位置。 切勿NSUserDefaults使用NSUserDefaults ,磁盘或Core Data上的其他plist文件,因为它们未加密! 在大多数情况下,iOS钥匙串是您的朋友。 如果您不喜欢直接使用C API,则可以使用包装器库,例如SSKeychain或UICKeyChainStore。

高阶函数是采用另一个函数/闭包作为参数返回另一个函数作为其结果的函数。