Swift 编码规范,成功入职字节跳动
顶级函数,类型和变量,永远应该有着详尽的权限控制说明符然而在这些函数/类型的内部,可以在合适的地方使用隐式权限控制:理由:顶级定义指定为internal很少有恰当的,要明确的确保经过了仔细的判断。在定义的内部重用同样的权限控制说明符就显得重复,而且默认的通常是合理的。基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因
理由: if let
绑定可选类型产生了更安全的代码,强行展开很可能导致运行时崩溃。
避免隐式解析的可选类型
如果 foo 可能为 nil
,尽可能的用 let foo: FooType?
代替 let foo: FooType!
(注意:一般情况下, ?
可以代替 !
) 理由: 明确的可选类型产生了更安全的代码。隐式解析的可选类型也可能会挂。
对于只读属性和 subscript
,选用隐式的 getters 方法
如果可以,省略只读属性和 subscript
的 get
关键字
所以应该这样写:
var myGreatProperty: Int {
return 4
}
subscript(index: Int) -> T {
return objects[index]
}
……而不是:
var myGreatProperty: Int {
get {
return 4
}
}
subscript(index: Int) -> T {
get {
return objects[index]
}
}
理由: 第一个版本的代码意图已经很清楚了,并且用了更少的代码
对于顶级定义,永远明确的列出权限控制
顶级函数,类型和变量,永远应该有着详尽的权限控制说明符
public var whoopsGlobalState: Int
internal struct TheFez {}
private func doTheThings(things: [Thing]) {}
然而在这些函数/类型的内部,可以在合适的地方使用隐式权限控制:
internal struct TheFez {
var owner: Person = Joshaber()
}
理由: 顶级定义指定为 internal
很少有恰当的,要明确的确保经过了仔细的判断。在定义的内部重用同样的权限控制说明符就显得重复,而且默认的通常是合理的。
当指定一个类型时,把 冒号和标识符 连在一起
当指定标示符的类型时,冒号要紧跟着标示符,然后空一格再写类型
class SmallBatchSustainableFairtrade: Coffee { … }
let timeToCoffee: NSTimeInterval = 2
func makeCoffee(type: CoffeeType) -> Coffee { … }
理由: 类型区分号是对于标示符来说的,所以要跟它连在一起。
此外,指定字典类型时,键类型后紧跟着冒号,接着加一个空格,之后才是值类型。
let capitals: [Country: City] = [sweden: stockholm]
需要时才写上 self
当调用 self
的属性或方法时,默认隐式引用 self
:
private class History {
var events: [Event]
func rewrite() {
events = []
}
}
必要的时候再加上 self
, 比如在(逃逸)闭包里,或者 参数名冲突了:
extension History {
init(events: [Event]) {
self.events = events
}
var whenVictorious: () -> () {
return {
self.rewrite()
}
}
}
原因: 在闭包里用 self
更加凸显它捕获 self
的语义,别处避免了冗长
首选 struct
而非 class
除非你需要 class
才能提供的功能(比如 identity 或 deinit
ializers),不然就用 struct
要注意到继承通常 不 是用 类 的好理由,因为 多态 可以通过 协议 实现,重用 可以通过 组合 实现。比如,这个类的分级
class Vehicle {
let numberOfWheels: Int
init(numberOfWheels: Int) {
self.numberOfWheels = numberOfWheels
}
func maximumTotalTirePressure(pressurePerWheel: Float) -> Float {
return pressurePerWheel * Float(numberOfWheels)
}
}
class Bicycle: Vehicle {
init() {
super.init(numberOfWheels: 2)
}
}
class Car: Vehicle {
init() {
super.init(numberOfWheels: 4)
}
}
可以重构成酱紫:
protocol Vehicle {
var numberOfWheels: Int { get }
}
func maximumTotalTirePressure(vehicle: Vehicle, pressurePerWheel: Float) -> Float {
return pressurePerWheel * Float(vehicle.numberOfWheels)
}
struct Bicycle: Vehicle {
let numberOfWheels = 2
}
struct Car: Vehicle {
let numberOfWheels = 4
}
理由: 值类型更简单,容易分析,并且 let
关键字的行为符合预期。
默认 class
为 final
class
应该用 final
修饰,并且只有在继承的有效需求已被确定时候才能去使用子类。即便在这种情况(前面提到的使用继承的情况)下,根据同样的规则( class
应该用 final
修饰的规则),类中的定义(属性和方法等)也要尽可能的用 final
来修饰 理由: 组合通常比继承更合适,选择使用继承则很可能意味着在做出决定时需要更多的思考。
能不写类型参数的就别写了
当对接收者来说一样时,参数化类型的方法可以省略接收者的类型参数。比如:
struct Composite {
…
func compose(other: Composite) -> Composite {
return Composite(self, other)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽
里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。
什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽
更多推荐
所有评论(0)