Swift是苹果公司推出的一种现代编程语言,它具有简洁、强大、安全的特点,被广泛应用于iOS、macOS、watchOS和tvOS的开发中。本文将详细介绍Swift的基础语法,帮助初学者快速上手。

1. 变量和常量

声明变量和常量

在Swift中,变量用var关键字声明,常量用let关键字声明。

  1. var variableName = 10
  2. let constantName = 20

类型注解

虽然Swift具有强大的类型推断功能,但有时我们也需要明确指定变量或常量的类型。这时可以使用类型注解。

  1. var variableName: Int = 10
  2. let constantName: Double = 20.0

2. 数据类型

基本数据类型

Swift提供了多种基本数据类型,包括整数、浮点数、布尔值和字符串。

  1. let intValue: Int = 42
  2. let doubleValue: Double = 3.14159
  3. let boolValue: Bool = true
  4. let stringValue: String = "Hello, Swift"

可选类型

可选类型用于表示可能有值也可能没有值的情况。使用?来声明一个可选类型。

  1. var optionalString: String? = "Hello"
  2. optionalString = nil

解包可选类型

在使用可选类型时,需要将其解包以获取实际值。可以使用if letguard let来安全地解包。

  1. if let unwrappedString = optionalString {
  2. print(unwrappedString)
  3. } else {
  4. print("optionalString is nil")
  5. }

3. 操作符

算术操作符

Swift支持常见的算术操作符,如加、减、乘、除和取余。

  1. let sum = 3 + 2
  2. let difference = 5 - 3
  3. let product = 4 * 2
  4. let quotient = 8 / 2
  5. let remainder = 9 % 2

赋值操作符

赋值操作符用于给变量或常量赋值。

  1. var a = 10
  2. a += 5 // 相当于 a = a + 5

比较操作符

比较操作符用于比较两个值的大小关系。

  1. let isEqual = (a == 5)
  2. let isNotEqual = (a != 5)
  3. let isGreater = (a > 5)
  4. let isLesser = (a < 5)
  5. let isGreaterOrEqual = (a >= 5)
  6. let isLesserOrEqual = (a <= 5)

逻辑操作符

逻辑操作符用于进行布尔值的逻辑运算。

  1. let andResult = true && false
  2. let orResult = true || false
  3. let notResult = !true

4. 控制流

条件语句

Swift提供了ifelse ifelse条件语句来执行条件判断。

  1. let score = 85
  2. if score >= 90 {
  3. print("Excellent")
  4. } else if score >= 80 {
  5. print("Good")
  6. } else {
  7. print("Needs Improvement")
  8. }

Switch语句

switch语句用于根据不同的情况执行不同的代码块。Swift的switch语句功能强大,支持模式匹配和区间匹配。

  1. let grade = "B"
  2. switch grade {
  3. case "A":
  4. print("Excellent")
  5. case "B":
  6. print("Good")
  7. case "C":
  8. print("Average")
  9. case "D":
  10. print("Below Average")
  11. default:
  12. print("Fail")
  13. }

循环语句

Swift支持for-inwhilerepeat-while循环。

  1. let items = ["Apple", "Banana", "Cherry"]
  2. for item in items {
  3. print(item)
  4. }
  5. var count = 5
  6. while count > 0 {
  7. print(count)
  8. count -= 1
  9. }
  10. repeat {
  11. print("This will run at least once")
  12. } while count > 0

5. 函数

定义函数

函数是执行特定任务的代码块。使用func关键字来定义函数。

  1. func greet(name: String) -> String {
  2. return "Hello, \(name)!"
  3. }
  4. let greeting = greet(name: "Swift")
  5. print(greeting)

函数参数与返回值

函数可以有多个参数和返回值。

  1. func add(a: Int, b: Int) -> Int {
  2. return a + b
  3. }
  4. let sum = add(a: 3, b: 5)
  5. print(sum)

参数标签

参数标签可以在函数调用时提供更多的可读性。

  1. func greet(person name: String) -> String {
  2. return "Hello, \(name)!"
  3. }
  4. let greeting = greet(person: "Swift")
  5. print(greeting)

6. 闭包

闭包表达式

闭包是自包含的代码块,可以在代码中传递和使用。闭包表达式语法简洁,类似于匿名函数。

  1. let numbers = [1, 2, 3, 4, 5]
  2. let doubledNumbers = numbers.map { (number: Int) -> Int in
  3. return number * 2
  4. }
  5. print(doubledNumbers)

尾随闭包

如果闭包是函数的最后一个参数,可以使用尾随闭包语法。

  1. let sortedNumbers = numbers.sorted { $0 > $1 }
  2. print(sortedNumbers)

7. 集合类型

数组

数组是有序的集合,可以存储相同类型的元素。

  1. var fruits: [String] = ["Apple", "Banana", "Cherry"]
  2. fruits.append("Date")
  3. print(fruits)

集合

集合是无序的集合,存储唯一的元素。

  1. var uniqueFruits: Set<String> = ["Apple", "Banana", "Cherry"]
  2. uniqueFruits.insert("Date")
  3. print(uniqueFruits)

字典

字典是键值对的集合,可以存储唯一键与对应值的映射。

  1. var fruitColors: [String: String] = ["Apple": "Red", "Banana": "Yellow", "Cherry": "Red"]
  2. fruitColors["Date"] = "Brown"
  3. print(fruitColors)

8. 字符串和字符

字符串操作

Swift中的字符串是Unicode字符的集合,支持多种操作。

  1. let hello = "Hello"
  2. let world = "World"
  3. let greeting = hello + ", " + world + "!"
  4. print(greeting)

字符操作

字符串中的字符可以通过遍历或索引访问。

  1. for char in greeting {
  2. print(char)
  3. }
  4. let firstChar = greeting[greeting.startIndex]
  5. print(firstChar)

9. 枚举

定义枚举

枚举用于定义一组相关的值。

  1. enum CompassDirection {
  2. case north
  3. case south
  4. case east
  5. case west
  6. }
  7. let direction = CompassDirection.north

关联值

枚举可以有关联值,以便在枚举值中存储附加信息。

  1. enum Barcode {
  2. case upc(Int, Int, Int, Int)
  3. case qrCode(String)
  4. }
  5. var productBarcode = Barcode.upc(8, 85909, 51226, 3)
  6. productBarcode = .qrCode("ABCDEFGHIJK")

原始值

枚举可以有原始值,原始值类型可以是字符串、整数或浮点数。

  1. enum Planet: Int {
  2. case mercury = 1, venus, earth, mars
  3. }
  4. let earth = Planet(rawValue: 3)
  5. print(earth!)

10. 结构体和类

定义结构体

结构体是一种值类型,适用于定义简单的数据模型。

  1. struct Person {
  2. var name: String
  3. var age: Int
  4. }
  5. var john = Person(name: "John", age: 25)
  6. john.age = 26
  7. print(john)

定义类

类是一种引用类型,适用于定义复杂的数据模型和行为。

  1. class Animal {
  2. var name: String
  3. init(name: String) {
  4. self.name = name
  5. }
  6. func speak() {
  7. print("\(name) makes a sound")
  8. }
  9. }
  10. let dog = Animal(name: "Dog")
  11. dog.speak()

11. 属性和方法

#

存储属性

类和结构体可以有存储属性,用于存储常量或变量。

  1. struct FixedLengthRange {
  2. var firstValue: Int
  3. let length: Int
  4. }
  5. var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
  6. rangeOfThreeItems.firstValue = 6

计算属性

计算属性不直接存储值,而是通过计算得出。

  1. struct Point {
  2. var x = 0.0, y = 0.0
  3. var distanceFromOrigin: Double {
  4. return sqrt(x * x + y * y)
  5. }
  6. }
  7. var point = Point(x: 3.0, y: 4.0)
  8. print(point.distanceFromOrigin) // 5.0

方法

方法是与特定类型相关联的函数。

  1. class Counter {
  2. var count = 0
  3. func increment() {
  4. count += 1
  5. }
  6. func increment(by amount: Int) {
  7. count += amount
  8. }
  9. func reset() {
  10. count = 0
  11. }
  12. }
  13. let counter = Counter()
  14. counter.increment()
  15. counter.increment(by: 5)
  16. counter.reset()
  17. print(counter.count) // 0

12. 继承

基类

类可以从基类继承方法、属性和其他特性。

  1. class Vehicle {
  2. var currentSpeed = 0.0
  3. var description: String {
  4. return "traveling at \(currentSpeed) miles per hour"
  5. }
  6. func makeNoise() {
  7. print("Generic vehicle noise")
  8. }
  9. }
  10. let someVehicle = Vehicle()
  11. print(someVehicle.description) // traveling at 0.0 miles per hour

子类

子类可以继承基类,并重写基类的方法或属性。

  1. class Bicycle: Vehicle {
  2. var hasBasket = false
  3. }
  4. let bicycle = Bicycle()
  5. bicycle.hasBasket = true
  6. bicycle.currentSpeed = 15.0
  7. print(bicycle.description) // traveling at 15.0 miles per hour

重写

使用override关键字来重写基类的方法或属性。

  1. class Train: Vehicle {
  2. override func makeNoise() {
  3. print("Choo Choo")
  4. }
  5. }
  6. let train = Train()
  7. train.makeNoise() // Choo Choo

13. 初始化

初始化器

初始化器用于创建类、结构体或枚举的实例。

  1. struct Fahrenheit {
  2. var temperature: Double
  3. init() {
  4. temperature = 32.0
  5. }
  6. }
  7. var f = Fahrenheit()
  8. print(f.temperature) // 32.0

自定义初始化

可以自定义初始化器以接收参数。

  1. struct Celsius {
  2. var temperatureInCelsius: Double
  3. init(fromFahrenheit fahrenheit: Double) {
  4. temperatureInCelsius = (fahrenheit - 32.0) / 1.8
  5. }
  6. init(fromKelvin kelvin: Double) {
  7. temperatureInCelsius = kelvin - 273.15
  8. }
  9. }
  10. let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
  11. print(boilingPointOfWater.temperatureInCelsius) // 100.0

初始化器委托

初始化器可以调用其他初始化器来完成实例的部分初始化。

  1. class Vehicle {
  2. var currentSpeed = 0.0
  3. init() {}
  4. init(speed: Double) {
  5. self.currentSpeed = speed
  6. }
  7. }
  8. class Car: Vehicle {
  9. var gear = 1
  10. init(speed: Double, gear: Int) {
  11. self.gear = gear
  12. super.init(speed: speed)
  13. }
  14. }
  15. let car = Car(speed: 60.0, gear: 3)
  16. print(car.currentSpeed, car.gear) // 60.0 3

14. 错误处理

错误类型

错误类型是遵循Error协议的类型,通常使用枚举来定义。

  1. enum VendingMachineError: Error {
  2. case invalidSelection
  3. case insufficientFunds(coinsNeeded: Int)
  4. case outOfStock
  5. }

抛出错误

使用throw关键字来抛出错误。

  1. func vend(itemNamed name: String) throws {
  2. throw VendingMachineError.outOfStock
  3. }

捕获错误

使用do-catch语句来捕获和处理错误。

  1. do {
  2. try vend(itemNamed: "Candy Bar")
  3. } catch VendingMachineError.invalidSelection {
  4. print("Invalid Selection")
  5. } catch VendingMachineError.insufficientFunds(let coinsNeeded) {
  6. print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")
  7. } catch VendingMachineError.outOfStock {
  8. print("Out of Stock")
  9. }

可选错误处理

使用try?try!来处理可选错误和强制错误。

  1. let x = try? vend(itemNamed: "Candy Bar") // 返回nil,因为vend抛出了错误
  2. let y = try! vend(itemNamed: "Candy Bar") // 运行时错误,因为vend抛出了错误

15. 协议和扩展

协议

协议定义了一组方法和属性,任何遵循该协议的类型都必须实现这些方法和属性。

  1. protocol FullyNamed {
  2. var fullName: String { get }
  3. }
  4. struct Person: FullyNamed {
  5. var fullName: String
  6. }
  7. let john = Person(fullName: "John Appleseed")
  8. print(john.fullName) // John Appleseed

扩展

扩展为现有类型添加新功能,包括计算属性和方法。

  1. extension Int {
  2. var isEven: Bool {
  3. return self % 2 == 0
  4. }
  5. func squared() -> Int {
  6. return self * self
  7. }
  8. }
  9. let number = 4
  10. print(number.isEven) // true
  11. print(number.squared()) // 16

16. 泛型

泛型函数

泛型函数可以处理任何类型的参数。

  1. func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
  2. let temporaryA = a
  3. a = b
  4. b = temporaryA
  5. }
  6. var firstInt = 1
  7. var secondInt = 2
  8. swapTwoValues(&firstInt, &secondInt)
  9. print(firstInt, secondInt) // 2 1

泛型类型

泛型类型可以用于定义泛型类、结构体或枚举。

  1. struct Stack<Element> {
  2. var items = [Element]()
  3. mutating func push(_ item: Element) {
  4. items.append(item)
  5. }
  6. mutating func pop() -> Element {
  7. return items.removeLast()
  8. }
  9. }
  10. var stackOfStrings = Stack<String>()
  11. stackOfStrings.push("First")
  12. stackOfStrings.push("Second")
  13. print(stackOfStrings.pop()) // Second

结论

Swift是一门现代化的编程语言,结合了简洁性、安全性和高性能的特点,极大地提升了开发者的生产力。本文详细介绍了Swift的基础语法,包括变量和常量、数据类型、操作符、控制流、函数、闭包、集合类型、字符串和字符、枚举、结构体和类、属性和方法、继承、初始化、错误处理、协议和扩展以及泛型。希望这篇文章能帮助你更好地理解和使用Swift,为你的开发工作提供有力支持。