Swift 编码规范

理由:  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%以上前端开发知识点,真正体系化!

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

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

最后

由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可领取!

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

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

最后

由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可领取!

[外链图片转存中…(img-FxFhKHqR-1712958124829)]

[外链图片转存中…(img-FL1GHhAd-1712958124829)]

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值