Swift是苹果公司推出的一种现代编程语言,它具有简洁、强大、安全的特点,被广泛应用于iOS、macOS、watchOS和tvOS的开发中。本文将详细介绍Swift的基础语法,帮助初学者快速上手。
1. 变量和常量
声明变量和常量
在Swift中,变量用var关键字声明,常量用let关键字声明。
var variableName = 10let constantName = 20
类型注解
虽然Swift具有强大的类型推断功能,但有时我们也需要明确指定变量或常量的类型。这时可以使用类型注解。
var variableName: Int = 10let constantName: Double = 20.0
2. 数据类型
基本数据类型
Swift提供了多种基本数据类型,包括整数、浮点数、布尔值和字符串。
let intValue: Int = 42let doubleValue: Double = 3.14159let boolValue: Bool = truelet stringValue: String = "Hello, Swift"
可选类型
可选类型用于表示可能有值也可能没有值的情况。使用?来声明一个可选类型。
var optionalString: String? = "Hello"optionalString = nil
解包可选类型
在使用可选类型时,需要将其解包以获取实际值。可以使用if let或guard let来安全地解包。
if let unwrappedString = optionalString {print(unwrappedString)} else {print("optionalString is nil")}
3. 操作符
算术操作符
Swift支持常见的算术操作符,如加、减、乘、除和取余。
let sum = 3 + 2let difference = 5 - 3let product = 4 * 2let quotient = 8 / 2let remainder = 9 % 2
赋值操作符
赋值操作符用于给变量或常量赋值。
var a = 10a += 5 // 相当于 a = a + 5
比较操作符
比较操作符用于比较两个值的大小关系。
let isEqual = (a == 5)let isNotEqual = (a != 5)let isGreater = (a > 5)let isLesser = (a < 5)let isGreaterOrEqual = (a >= 5)let isLesserOrEqual = (a <= 5)
逻辑操作符
逻辑操作符用于进行布尔值的逻辑运算。
let andResult = true && falselet orResult = true || falselet notResult = !true
4. 控制流
条件语句
Swift提供了if、else if和else条件语句来执行条件判断。
let score = 85if score >= 90 {print("Excellent")} else if score >= 80 {print("Good")} else {print("Needs Improvement")}
Switch语句
switch语句用于根据不同的情况执行不同的代码块。Swift的switch语句功能强大,支持模式匹配和区间匹配。
let grade = "B"switch grade {case "A":print("Excellent")case "B":print("Good")case "C":print("Average")case "D":print("Below Average")default:print("Fail")}
循环语句
Swift支持for-in、while和repeat-while循环。
let items = ["Apple", "Banana", "Cherry"]for item in items {print(item)}var count = 5while count > 0 {print(count)count -= 1}repeat {print("This will run at least once")} while count > 0
5. 函数
定义函数
函数是执行特定任务的代码块。使用func关键字来定义函数。
func greet(name: String) -> String {return "Hello, \(name)!"}let greeting = greet(name: "Swift")print(greeting)
函数参数与返回值
函数可以有多个参数和返回值。
func add(a: Int, b: Int) -> Int {return a + b}let sum = add(a: 3, b: 5)print(sum)
参数标签
参数标签可以在函数调用时提供更多的可读性。
func greet(person name: String) -> String {return "Hello, \(name)!"}let greeting = greet(person: "Swift")print(greeting)
6. 闭包
闭包表达式
闭包是自包含的代码块,可以在代码中传递和使用。闭包表达式语法简洁,类似于匿名函数。
let numbers = [1, 2, 3, 4, 5]let doubledNumbers = numbers.map { (number: Int) -> Int inreturn number * 2}print(doubledNumbers)
尾随闭包
如果闭包是函数的最后一个参数,可以使用尾随闭包语法。
let sortedNumbers = numbers.sorted { $0 > $1 }print(sortedNumbers)
7. 集合类型
数组
数组是有序的集合,可以存储相同类型的元素。
var fruits: [String] = ["Apple", "Banana", "Cherry"]fruits.append("Date")print(fruits)
集合
集合是无序的集合,存储唯一的元素。
var uniqueFruits: Set<String> = ["Apple", "Banana", "Cherry"]uniqueFruits.insert("Date")print(uniqueFruits)
字典
字典是键值对的集合,可以存储唯一键与对应值的映射。
var fruitColors: [String: String] = ["Apple": "Red", "Banana": "Yellow", "Cherry": "Red"]fruitColors["Date"] = "Brown"print(fruitColors)
8. 字符串和字符
字符串操作
Swift中的字符串是Unicode字符的集合,支持多种操作。
let hello = "Hello"let world = "World"let greeting = hello + ", " + world + "!"print(greeting)
字符操作
字符串中的字符可以通过遍历或索引访问。
for char in greeting {print(char)}let firstChar = greeting[greeting.startIndex]print(firstChar)
9. 枚举
定义枚举
枚举用于定义一组相关的值。
enum CompassDirection {case northcase southcase eastcase west}let direction = CompassDirection.north
关联值
枚举可以有关联值,以便在枚举值中存储附加信息。
enum Barcode {case upc(Int, Int, Int, Int)case qrCode(String)}var productBarcode = Barcode.upc(8, 85909, 51226, 3)productBarcode = .qrCode("ABCDEFGHIJK")
原始值
枚举可以有原始值,原始值类型可以是字符串、整数或浮点数。
enum Planet: Int {case mercury = 1, venus, earth, mars}let earth = Planet(rawValue: 3)print(earth!)
10. 结构体和类
定义结构体
结构体是一种值类型,适用于定义简单的数据模型。
struct Person {var name: Stringvar age: Int}var john = Person(name: "John", age: 25)john.age = 26print(john)
定义类
类是一种引用类型,适用于定义复杂的数据模型和行为。
class Animal {var name: Stringinit(name: String) {self.name = name}func speak() {print("\(name) makes a sound")}}let dog = Animal(name: "Dog")dog.speak()
11. 属性和方法
#
存储属性
类和结构体可以有存储属性,用于存储常量或变量。
struct FixedLengthRange {var firstValue: Intlet length: Int}var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)rangeOfThreeItems.firstValue = 6
计算属性
计算属性不直接存储值,而是通过计算得出。
struct Point {var x = 0.0, y = 0.0var distanceFromOrigin: Double {return sqrt(x * x + y * y)}}var point = Point(x: 3.0, y: 4.0)print(point.distanceFromOrigin) // 5.0
方法
方法是与特定类型相关联的函数。
class Counter {var count = 0func increment() {count += 1}func increment(by amount: Int) {count += amount}func reset() {count = 0}}let counter = Counter()counter.increment()counter.increment(by: 5)counter.reset()print(counter.count) // 0
12. 继承
基类
类可以从基类继承方法、属性和其他特性。
class Vehicle {var currentSpeed = 0.0var description: String {return "traveling at \(currentSpeed) miles per hour"}func makeNoise() {print("Generic vehicle noise")}}let someVehicle = Vehicle()print(someVehicle.description) // traveling at 0.0 miles per hour
子类
子类可以继承基类,并重写基类的方法或属性。
class Bicycle: Vehicle {var hasBasket = false}let bicycle = Bicycle()bicycle.hasBasket = truebicycle.currentSpeed = 15.0print(bicycle.description) // traveling at 15.0 miles per hour
重写
使用override关键字来重写基类的方法或属性。
class Train: Vehicle {override func makeNoise() {print("Choo Choo")}}let train = Train()train.makeNoise() // Choo Choo
13. 初始化
初始化器
初始化器用于创建类、结构体或枚举的实例。
struct Fahrenheit {var temperature: Doubleinit() {temperature = 32.0}}var f = Fahrenheit()print(f.temperature) // 32.0
自定义初始化
可以自定义初始化器以接收参数。
struct Celsius {var temperatureInCelsius: Doubleinit(fromFahrenheit fahrenheit: Double) {temperatureInCelsius = (fahrenheit - 32.0) / 1.8}init(fromKelvin kelvin: Double) {temperatureInCelsius = kelvin - 273.15}}let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)print(boilingPointOfWater.temperatureInCelsius) // 100.0
初始化器委托
初始化器可以调用其他初始化器来完成实例的部分初始化。
class Vehicle {var currentSpeed = 0.0init() {}init(speed: Double) {self.currentSpeed = speed}}class Car: Vehicle {var gear = 1init(speed: Double, gear: Int) {self.gear = gearsuper.init(speed: speed)}}let car = Car(speed: 60.0, gear: 3)print(car.currentSpeed, car.gear) // 60.0 3
14. 错误处理
错误类型
错误类型是遵循Error协议的类型,通常使用枚举来定义。
enum VendingMachineError: Error {case invalidSelectioncase insufficientFunds(coinsNeeded: Int)case outOfStock}
抛出错误
使用throw关键字来抛出错误。
func vend(itemNamed name: String) throws {throw VendingMachineError.outOfStock}
捕获错误
使用do-catch语句来捕获和处理错误。
do {try vend(itemNamed: "Candy Bar")} catch VendingMachineError.invalidSelection {print("Invalid Selection")} catch VendingMachineError.insufficientFunds(let coinsNeeded) {print("Insufficient funds. Please insert an additional \(coinsNeeded) coins.")} catch VendingMachineError.outOfStock {print("Out of Stock")}
可选错误处理
使用try?和try!来处理可选错误和强制错误。
let x = try? vend(itemNamed: "Candy Bar") // 返回nil,因为vend抛出了错误let y = try! vend(itemNamed: "Candy Bar") // 运行时错误,因为vend抛出了错误
15. 协议和扩展
协议
协议定义了一组方法和属性,任何遵循该协议的类型都必须实现这些方法和属性。
protocol FullyNamed {var fullName: String { get }}struct Person: FullyNamed {var fullName: String}let john = Person(fullName: "John Appleseed")print(john.fullName) // John Appleseed
扩展
扩展为现有类型添加新功能,包括计算属性和方法。
extension Int {var isEven: Bool {return self % 2 == 0}func squared() -> Int {return self * self}}let number = 4print(number.isEven) // trueprint(number.squared()) // 16
16. 泛型
泛型函数
泛型函数可以处理任何类型的参数。
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {let temporaryA = aa = bb = temporaryA}var firstInt = 1var secondInt = 2swapTwoValues(&firstInt, &secondInt)print(firstInt, secondInt) // 2 1
泛型类型
泛型类型可以用于定义泛型类、结构体或枚举。
struct Stack<Element> {var items = [Element]()mutating func push(_ item: Element) {items.append(item)}mutating func pop() -> Element {return items.removeLast()}}var stackOfStrings = Stack<String>()stackOfStrings.push("First")stackOfStrings.push("Second")print(stackOfStrings.pop()) // Second
结论
Swift是一门现代化的编程语言,结合了简洁性、安全性和高性能的特点,极大地提升了开发者的生产力。本文详细介绍了Swift的基础语法,包括变量和常量、数据类型、操作符、控制流、函数、闭包、集合类型、字符串和字符、枚举、结构体和类、属性和方法、继承、初始化、错误处理、协议和扩展以及泛型。希望这篇文章能帮助你更好地理解和使用Swift,为你的开发工作提供有力支持。
