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

Swift-语法基础

 一、声明

变量声明 

以关键字 var 开头的声明引入变量,该变量在程序执行期间可以具有不同的值。

var str: String = "hello"
str = "hello, world"

常量声明

以关键字 let 开头的声明引入只读常量,该常量只能被赋值一次。

let str: String = "hello"

二、类型

Int类型

Int 整数类型,又包含Int8、Int16、Int32、Int64。

let intNum: Int = 12
let maxInt16: Int16 = Int16.max
let MinInt32: Int32 = Int32.min

Float类型

Float 浮点数类型。

let floatNum: Float = 3.14

Bool类型

Bool 类型由 true 和 false 两个逻辑值组成。

let success: Bool = true
if success {// do something
}

String类型

String 代表字符序列,可以使用转义字符来表示字符。

let str1 = "title"
let str2 = "detail"
let str3 = str1 + " " + str2;let isContain = str3.contains(str1)let content = "content: \(str3)"
print(content)let intNum = Int("12") // 12
let floatNum = Float("3.14") // 3.14_ = " every body ".replacingOccurrences(of: " ", with: "") // 'everybody'
_ = " every body ".trimmingCharacters(in: .whitespaces) // 'every body'let hasPrefix = "every one".hasPrefix("every") // true
let hasSuffix = "every one".hasSuffix("one") // true

Array类型

Array 类型是由可赋值给数组声明中指定的元素类型的数据组成的对象。

var arr1 = Array<String>()
arr1.append("red")
arr1.append("blue")
arr1.removeLast()
let isEmpty = arr1.isEmpty // ["red"]var arr2 = [String]()
arr2.append("black")
arr2.append("gray")
let obj = arr2[0] // "black"
let count = arr2.countlet arr3 = arr1 + arr2 // ["red", "black", "gray"]
let isContain = arr3.contains("gray") let arr4 = Array(arr3[1...]) // ["black", "gray"]let segments = "m.baidu.com".components(separatedBy: ".") // ["m", "baidu", "com"]
let host = components.joined(separator: ".") // "m.baidu.com"

Dictionary类型

Dictionary 是 HashMap 结构,存储 key-value 键值对。

var dic1 = [String: String]()
dic1["hello"] = "world"
dic1.removeValue(forKey: "hello")
_ = dic1.isEmptyvar dic2: [Int: Int] = [1:1, 2:2, 3:3]
dic2[4] = 4
print("count: \(dic2.count)")

Void类型

Void 类型用于指定函数没有返回值。

func getDeviceId() -> Void {// do somethind
}

Enum类型

enum 枚举类型用于声明一组命名的常数。

// 声明
enum Direction {case LEFTcase RIGHTcase TOPcase BOTTOM
}// 应用
let direction = Direction.LEFT

三、语句

if语句

if condition {// do something
}

if 结合 let 的应用场景 

// 常规的非空判断
func execute(value: String?) {if value != nil {print("\(value!.count)")}
}// 结合let的非空判断
func execute(value: String?) {if let value = value {print("\(value.count)")}
}

switch语句

switch type {case 0: // do somethingcase 1, 2:// do somethingdefault:// do something
}

for语句

let arr: [String] = ["a", "b", "c", "d", "e"]
for i in 0..<arr.count {let str = arr[i]if str == 'd' {break}// do something
}
let arr: [String] = ["a", "b", "c", "d", "e"]
for str in arr {if str == 'b' {continue}// do something
}
let arr: [String] = ["a", "b", "c", "d", "e"]
arr.forEach{ obj in// do something
}arr.enumerated().forEach { (idx, obj) in// do something
}let dic: [Int: Int] = [1:1, 2:2, 3:3]
dic.forEach { (key, value) in// do something
}

while语句

while condition {// do something
}

try-catch语句

do {try // do something
} catch {print(error)
}

四、运算符

三元运算符

let str = value ? value : ""let str1 = value ?? ""

加/减运算符

let i = 0
i += 1 // 等价与 i = i+1let j = 10
j -= 1 // 等价与 j = j-1

可选链运算符

1)变量/属性的定义

class Article {var title: string = "标题"var summary: String?init() {self.summary = "简介"}func execute(hasSign: Bool) {_ = self.title.count_ = self.summary?.countvar sign: String? // 先声明if hasSign {sign = "署名" // 再赋值}let signLength = sign?.count ?? 0}
}

2)方法传参

func execute(_ str1: String, _ str2: String?) -> String {return str1 + (str2 ?? "")
}execute("a", nil)

五、函数

常规的函数声明/调用。

func execute(arg1: String, arg2: String?) -> Bool {// do somethingreturn true
}execute(arg1: "title", arg2: nil)
func execute(_ str1: inout String, _ str2: String) {str1 += str2
}var str1 = "he"
execute(&str1, "llo")

 带回调的函数声明/调用。

func execute(callBack: ((String) -> Void)?) {if let callBack = callBack {callBack("success")}
}execute { result in// do something
}

六、类

类声明

引入一个新类型,并定义其字段、方法和构造函数。

class Car {var name: String = ""var style: String = ""var price: Float?private var identify: String?init() { ... }func execute() {let detail = "\(self.name) \(self.style)"print(detail)}
}

构造函数

1)不带参数

init() {// do something
}

2)带参数

init(name: String, style: String) {self.name = nameself.style = style// do something
}

 3)调用时机

// 不带参数
let car1 = Car() 
car1.name = "Tesla"
car1.style = "Model 3"// 带参数
let car1 = Car(name: "Tesla", style: "Model 3")

实例方法

class Car {init() { ... }func execute() {// do something} 
}Car().execute()

类方法

class Car {class func execute() {// do something} 
}Car.execute()

Getter/Setter方法

class Car {private var _name: String = ""private var _price: Float?var name: String {get {return _name}set {_name = newValue}}var price: Float? {get {return _price}set {_price = newValue}}func execute() {self.name = "BYD" // setprint(self.name) // get}
}

类继承

class BydCar: Car {var Batterylife: Int?override init() {super.init()self.name = "Byd"}override func execute() {super.execute()// do something}
}

方法重写

class BydCar: Car {override func execute() {// 重写execute方法}
}

方法重载

class BydCar: Car {func execute(_ argument: [String: String]) {// 重载execute方法(修改入参)}func execute(_ argument: String) -> Bool {// 重载execute方法(修改入参/出参)}
}

协议声明

protocol CarInterface {func drive()
} 

协议继承

protocol BydInterface: CarInterface {func automaticParking()
} 

协议实现

class BydCar: Car, BydInterface {override init() {super.init()self.name = "Byd"}func drive() {// drive }func automaticParking() {// automatic parking}
} 

静态属性

// 声明
class EventConstants {static let AVAILABLE    = truestatic let LOAD_EVENT   = "onLoad"static let UNLOAD_EVENT = "onUnload"
}// 应用
let available = EventConstants.AVAILABLE

静态方法

// 声明
class DeviceUtils {static func getDeviceName() -> String {return "iPhone 15"}
}// 应用
let deviceName = DeviceUtils.getDeviceName()

本文参考于 Swift 官方文档:Swift Documentation

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • DeferredResult 是如何实现异步处理请求的
  • 安装 pyenv
  • MATLAB进阶:数据的拟合
  • Java中,synchronized修饰的静态方法会对整个对象加锁,这个是怎么实现的?
  • linux一些基础知识(未完待续)
  • 邻接矩阵实现图的存储
  • fastapi实现文件上传和下载的功能
  • Python基于逻辑回归的L1正则化(Lasso Logistic Regression)进行分类数据的特征选择项目实战
  • 每天一个数据分析题(四百六十)- 麦肯锡
  • C++自定义接口类设计器之可对称赋值三
  • elk+filebeat+kafka集群部署
  • 抖音小店新宠儿成都夏光汝网络科技
  • 对优先级队列(堆)的理解
  • 【工具】-gdb-学习笔记
  • 推动未来的引擎:人工智能大模型的现状与发展
  • 【RocksDB】TransactionDB源码分析
  • 【前端学习】-粗谈选择器
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • AWS实战 - 利用IAM对S3做访问控制
  • git 常用命令
  • MySQL数据库运维之数据恢复
  • Netty 4.1 源代码学习:线程模型
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 聊聊hikari连接池的leakDetectionThreshold
  • 区块链共识机制优缺点对比都是什么
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 正则与JS中的正则
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2.2w字)前端单元测试之Jest详解篇
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (LLM) 很笨
  • (苍穹外卖)day03菜品管理
  • (二)pulsar安装在独立的docker中,python测试
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (转)linux下的时间函数使用
  • (转)使用VMware vSphere标准交换机设置网络连接
  • **CI中自动类加载的用法总结
  • .bat批处理出现中文乱码的情况
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core使用ef 6
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net Redis的秒杀Dome和异步执行
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限