当前位置: 首页 > article >正文

swift 专题三 swift 规范一

一、Swift编码命名规范

  • 对类、结构体、枚举和协议等类型的命名应该采用大驼峰法,如 SplitViewController。

  • 文件名采用大驼峰法,如BlockOperation.swift。

  • 对于扩展文件,有时扩展定义在一个独立的文件中,用“原始类型名 + 扩展名”作为扩展文件名,如NSOperation + Operations.swift。

  • 变量和属性采用小驼峰法,如studentNumber。

  • 常量采用大驼峰法, 如MaxStudentNumber。

  • 枚举成员与常量类似,采用大驼峰法,如ExecutionFailed。

  • 函数和方法采用小驼峰法,如balanceAccount、isButtonPressed等。

二、注释规范

注释规范有:

  • 文件规范
  • 文档注释
  • 代码注释
  • 使用地标注释

2.1、文件注释

文件注释就是在每一个文件开头添加注释。文件注释通常包括如下信息:版权信息、文件名、所在模块、作者信息、历史版本信息、文件内容和作用等。

2.2、文档注释

文档注释是指这种注释内容能够生成API帮助文档。文档注释主要对类型、属性、方法或函数等进行注释。

  • 单行文档注释(///)
  • 多行文档注释(/*.../)

如下图:

2.3、代码注释

程序代码中处理文档注释还需要在一些关键的地方添加代码注释,文档注释一般是给一些看不到源代码的人看的帮助文档,而代码注释是给阅读源代码的人参考的。

  • 单行注释( // )
  • 多行注释 ( /.../ )
使用地标注释
  • MARK, 用于方法或函数的注释;
  • TODO, 表示这里的代码有没有完成或者还要处理;
  • FIXME,表示这里修改了代码。

三、声明

  • 变量或常量声明
  • 属性声明

3.1 、变量或常量声明时,每行声明变量或常量的数量推荐一行一个,因为这样有利于写注释。

​
推荐使用:let level = 0
var size = 10不推荐使用:let level,   le2,   le3 = 0;   var size = 10​

3.2 、还有变量或常量的数据类型,如果有可能应尽量采用类型推断,这样代码更简洁。
推荐使用:

推荐使用:
let level = 0
var size = 10
不推荐使用:
let level: Int = 0
var size: Int = 10

3.3、如果不是默认数据类型,我们需要声明变量或常量的数据类型,示例代码如下:

let level: Int8 = 0
var size: Int64 = 10

3.4、指定数据类型时需要使用冒号(:),变量或常量与冒号之间没有空格,冒号和数据类型之间要有一个空格。示例代码如下:

推荐使用:
let level: Int8 = 0
var size: Int64 = 10
不推荐使用:let level : Int8 = 0
var size: Int64=10

3.5、使用数据类型时应尽可能使用Swift本身的数据类型

推荐使用:
let width = 120.0
let widthString = "Hello."
var deviceModels: [String]
var employees: [Int: String]
不推荐使用:
let width:  NsNumber = 120.0
let widthString: NSString = "Hello."
var deviceModels: NSArray
var employees: NSDictionary

3.6 计算属性的规范

  • 如果是存储属性,声明规范与变量或常量声明的规范一样。
  • 如果是计算属性,声明规范类似于代码块,特别是在使用只读计算属性时,应尽量省略get语句。
推荐使用:
var fullName: String  {return firstName + "." + lastName
}
不推荐使用:
var fullName: String  {get {return  firstName  +  "."  +  lastName}
}

四、代码排版

  • 类型声明之前
  • import语句前后
  • 两个方法或函数之间
  • 块注释或单行注释之前
  • 一个源文件的两个片段之间

4.1、空格

1、赋值符号“=”前后各有一个空格。var 或let 与标识符之间有一个空格。所有的二元运算符都应该使用空格与操作符分开。一元操作符和操作数之间不应该有空格,如++、--等。
示例如下

var a = 10
var c = 10
a += c + d

2、(2)小左括号“("之后,小右括号“)”之前不应该有空。
示例如下:

a = (a + b) / (c * d)

3、大左括号“{”之前有一个空格,示例如下

while a == d {n++
}

4、在方法或函数名与第一参数之间没有空格,后面的参数前应该有一个空格,参数冒号与数据类型之间也有一个空格。
 

推荐使用:func tableView(_ tableView: UITableView, didSelectRowAt   indexPath: IndexPath) {...
}
不推荐使用:
func tableView ( _ tableView: UITableView, didSelectRowAt   indexPath: IndexPath) {...
}

五、缩进

  • 在函数、方法、闭包、控制语句、计算属性等包含大括号“{}”的代码块中,代码块的内容相对于首行缩进一个级别(4个空格)。

  • 如果是if语句中条件表达式的断行,那么新的一行应该相对于上一行缩进两个级别(8个空格),再往后的断行要与第一次的断行对齐

六、if let

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: Intinternal struct TheFez {}private func doTheThings(things: [Thing]) {}然而在这些函数/类型的内部,可以在合适的地方使用隐式权限控制:internal struct TheFez {var owner: Person = Joshaber()}

理由: 顶级定义指定为  internal 很少有恰当的,要明确的确保经过了仔细的判断。在定义的内部重用同样的权限控制说明符就显得重复,而且默认的通常是合理的。

十、当指定一个类型时,把 冒号和标识符 连在一起

当指定标示符的类型时,冒号要紧跟着标示符,然后空一格再写类型

class SmallBatchSustainableFairtrade: Coffee { … }let timeToCoffee: NSTimeInterval = 2func 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: Intinit(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 关键字的行为符合预期。

相关文章:

swift 专题三 swift 规范一

一、Swift编码命名规范 对类、结构体、枚举和协议等类型的命名应该采用大驼峰法,如 SplitViewController。 文件名采用大驼峰法,如BlockOperation.swift。 对于扩展文件,有时扩展定义在一个独立的文件中,用“原始类型名 扩展名…...

WPS计算机二级•幻灯片放映与会议

听说这是目录哦 放映PPT时常用的快捷技巧🥬设置放映模式🥕演讲备注的添加和隐藏🫚在PPT中插入附件并放映时打开🫛隐藏幻灯片 不被放映和打印🍄‍🟫演讲计时模式🥦能量站😚 放映PPT时…...

联想拯救者开机进入bios

如果你的联想拯救者(Lenovo Legion)笔记本电脑开机后直接进入 BIOS 设置界面,可能是以下原因之一导致的。以下是解决方法: 1. 检查启动顺序 进入 BIOS 后,找到 Boot(启动)选项卡。检查启动顺序…...

云原生周刊:K8s引领潮流

开源项目推荐 KWOK KWOK(Kubernetes WithOut Kubelet)是一个开源项目,旨在提供一个轻量级的 K8s 集群模拟环境,允许用户在不依赖真实节点的情况下,本地模拟整个 K8s 集群。它通过模拟 Kubelet 和其他集群组件的行为&…...

FBX SDK的使用:基础知识

Windows环境配置 FBX SDK安装后,目录下有三个文件夹: include 头文件lib 编译的二进制库,根据你项目的配置去包含相应的库samples 官方使用案列 动态链接 libfbxsdk.dll, libfbxsdk.lib是动态库,需要在配置属性->C/C->预…...

计算机网络笔记再战——理解几个经典的协议6——TCP与UDP

目录 先说端口号 TCP 使用序号保证顺序性和应答来保证有效性 超时重传机制 TCP窗口机制 UDP 路由协议 协议分类:IGP和EGP 几个经典的路由算法 RIP OSPF 链路状态数据库(LSDB) LSA(Link State Advertisement&#xff0…...

Android 单例模式:实现可复用数据存储

引言 在 Java 开发中,我们经常会遇到需要在整个应用程序中共享数据的场景。例如,配置信息、缓存数据等,这些数据需要在不同的模块或类中被访问和使用。为了确保数据的一致性和避免重复创建,我们可以使用单例模式来实现一个可复用的…...

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制 一. 数据同步 在之前的学习中有了副本Replica的概念,解决了数据备份的问题。我们还需要面临一个设计难题即:如何处理分区中Leader与Follwer节点数据同步不匹配问题所带来的风险,这也是保证数据高可用的…...

【Linux】curl命令详解

【Linux】curl命令详解 【一】curl命令介绍【1】curl命令简介【2】curl命令的基本语法【3】常用的curl命令选项【4】常用的curl命令参数 【二】curl命令示例用法【1】下载文件【2】发送 POST 请求【3】发送请求时附加头部信息【4】请求方法【5】指定用户名和密码进行身份验证【…...

创建模态框和非模态框

主要的精简代码就这些 #include <QDialog>// 创建模态框 QDialog dialog(this); // 添加各种部件 // ... // 因为创建在栈上面&#xff0c;所以需要阻止程序继续运行 dialog.exec();// 非模态框 QDialog dialog new Dialog(this); // 添加各种部件 // ... dialog.show(…...

电商用户画像数据可视化分析

电商用户画像数据可视化分析 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&am…...

Vue3.5常用特性整理

Vue3.5 发布已近半年&#xff0c;抽空整理下常用的新增/改动特性 响应式 Props 解构 Vue3.5 中 Props 正式支持解构了&#xff0c;并添加了响应式跟踪 设置默认值 使用 JavaScript 原生的默认值语法声明 props 默认值 以前 const props withDefaults(defineProps<{ co…...

Android Studio:Application 和 Activity的区别

Application 和 Activity 是 Android 中非常重要的两个组件&#xff0c;它们分别负责不同的生命周期管理和应用的不同层次的操作。 Application 是应用级别的生命周期管理&#xff0c;它在整个应用运行时只有一个实例&#xff0c;负责应用的全局初始化和资源管理。Activity 是…...

深入解析“Self-Contained”——从技术到日常的全方位应用

深入解析“Self-Contained”——从技术到日常的全方位应用 一、引言 在阅读技术文档、编程指南或产品说明时&#xff0c;你可能经常看到 self-contained 这个短语。例如&#xff1a; Our end goal is a self-contained project containing two parts. https://howistart.org/p…...

2024年12月 Scratch 图形化(一级)真题解析 中国电子学会全国青少年软件编程等级考试

202412 Scratch 图形化&#xff08;一级&#xff09;真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题&#xff0c;共50分) 第 1 题 点击下列哪个按钮&#xff0c;可以将红框处的程序放大&#xff1f;&#xff08; &#xff09; A. B. C. D. 标…...

llama.cpp GGML Quantization Type

llama.cpp GGML Quantization Type 1. GGML Quantization Type2. static const struct ggml_type_traits type_traits[GGML_TYPE_COUNT]3. Q#_K_M and Q#_KReferences 什么神仙妖魔&#xff0c;不过是他们禁锢异族命运的枷锁&#xff01; GGUF https://huggingface.co/docs/hu…...

【深度学习框架】MXNet(Apache MXNet)

MXNet&#xff08;Apache MXNet&#xff09;是一个 高性能、可扩展 的 开源深度学习框架&#xff0c;支持 多种编程语言&#xff08;如 Python、R、Scala、C 和 Julia&#xff09;&#xff0c;并能在 CPU、GPU 以及分布式集群 上高效运行。MXNet 是亚马逊 AWS 官方支持的深度学…...

游戏引擎学习第87天

当直接使用内存时&#xff0c;可能会发生一些奇怪的事情 在直接操作内存时&#xff0c;一些意外的情况可能会发生。由于内存实际上只是一个大块的空间&#xff0c;开发者可以完全控制它&#xff0c;而不像高级语言那样必须遵守许多规则&#xff0c;因此很容易发生错误。在一个…...

【物联网】ARM核常用指令(详解):数据传送、计算、位运算、比较、跳转、内存访问、CPSR/SPSR

文章目录 指令格式&#xff08;重点&#xff09;1. 立即数2. 寄存器位移 一、数据传送指令1. MOV指令2. MVN指令3. LDR指令 二、数据计算指令1. ADD指令1. SUB指令1. MUL指令 三、位运算指令1. AND指令2. ORR指令3. EOR指令4. BIC指令 四、比较指令五、跳转指令1. B/BL指令2. l…...

Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器

一、前言说明 音视频开发除了应用在安防监控、视频网站、各种流媒体app开发之外&#xff0c;还有一个小众的市场&#xff0c;那就是多媒体展厅场景&#xff0c;这个场景目前处于垄断地位的软件是HirenderS3&#xff0c;做的非常早而且非常全面&#xff0c;都是通用的需求&…...

VSCode源码分析参考资料

VSCode Architecture Analysis - Electron Project Cross-Platform Best Practices 中文版 VSCode 架构分析 - Electron 项目跨平台最佳实践 Sihan Li博客上的vscode源码分析系列&#xff1a;分析了微服务架构、事件体系、资源管理、配置系统等 文召博客上的vscode 源码解析…...

html中的表格属性以及合并操作

表格用table定义&#xff0c;标签标题用caption标签定义&#xff1b;用tr定义表格的若干行&#xff1b;用td定义若干个单元格&#xff1b;&#xff08;当单元格是表头时&#xff0c;用th标签定义&#xff09;&#xff08;th标签会略粗于td标签&#xff09; table的整体外观取决…...

html的字符实体和颜色表示

在HTML中&#xff0c;颜色可以通过以下几种方式表示&#xff0c;以下是具体的示例&#xff1a; 1. 十六进制颜色代码 十六进制颜色代码以#开头&#xff0c;后面跟随6个字符&#xff0c;每两个字符分别表示红色、绿色和蓝色的强度。例如&#xff1a; • #FF0000&#xff1a;纯红…...

unordered_map/set的哈希封装

【C笔记】unordered_map/set的哈希封装 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】unordered_map/set的哈希封装前言一. 源码及框架分析二.迭代器三.operator[]四.使用哈希表封装unordered_map/set后言 前言 哈…...

运算符(C#)

运算符(C#) 算数运算符 - * / % //算数运算符// - * / %//这跟我们初中的运算符一样// 加号Console.WriteLine(12);//3int a 5 6;Console.WriteLine(a);//11// - 减号Console.WriteLine(6-3);//3int b 10 - 6;Console.WriteLine(b);//4// * 乘号Console.WriteL…...

idea中git的简单使用

提交&#xff0c;推送直接合并 合到哪个分支就到先切到哪个分支...

Fastdds学习分享_xtpes_发布订阅模式及rpc模式

在之前的博客中我们介绍了dds的大致功能&#xff0c;与组成结构。本篇博文主要介绍的是xtypes.分为理论和实际运用两部分.理论主要用于梳理hzy大佬的知识&#xff0c;对于某些一带而过的部分作出更为详细的阐释&#xff0c;并在之后通过实际案例便于理解。案例分为普通发布订阅…...

SQLite Update 语句详解

SQLite Update 语句详解 SQLite 是一款轻量级的数据库管理系统&#xff0c;以其简单、易用和高效的特点在全球范围内得到了广泛的应用。在 SQLite 中&#xff0c;UPDATE 语句是用于修改数据库表中记录的常用命令。本文将详细解析 SQLite 的 UPDATE 语句&#xff0c;包括其语法…...

【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)

用户行为日志分析(python+hadoop+mapreduce+yarn+hive) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm远程连接虚拟机Python 搭建完全分布式高可用大数据集群(MySQL+Hive)...

开发板上Qt运行的环境变量的三条设置语句的详解

在终端中运行下面三句命令用于配置开发板上Qt运行的环境变量&#xff1a; export QT_QPA_GENERIC_PLUGINStslib:/dev/input/event1 export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/lib/fonts/设置成功后可以用下面的语句检查设置成功没有 echo $QT_QPA…...