理由:  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 或  deinitializers),不然就用  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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽

里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。

什么?你问面试题资料在哪里,这不是就在你眼前吗(滑稽

资料领取方式:戳这里免费领取

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐