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 Controllers和Models之类的文件夹(因为这些文件夹会很快冒风险成为垃圾场)。
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。
高阶函数是采用另一个函数/闭包作为参数或返回另一个函数作为其结果的函数。