Skip to content

Swift 入门(4):流程控制(if、switch、循环)

程序的核心就是控制执行流程。Swift 提供了清晰的条件判断和循环语法,语义直观,易读易写。

if 条件语句

swift
let score = 85

if score >= 90 {
    print("优秀")
} else if score >= 60 {
    print("及格")
} else {
    print("不及格")
}

注意:条件表达式必须是布尔值,不能像 C 那样用 10

版本兼容性检查:#available

swift
// iOS 版本兼容性检查
if #available(iOS 16.0, *) {
    // iOS 16+ 可用的代码
    let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(relyingPartyIdentifier: "example.com")
    // 使用 Passkeys 功能
} else {
    // iOS 16 以下的降级处理
    print("需要 iOS 16 或更高版本")
}

#available 语法详解

swift
if #available(平台 版本号, *) {
    // 新版本可用的代码
} else {
    // 旧版本的兜底处理
}

参数说明

  • iOS 16.0:指定最低支持的 iOS 版本
  • *:表示其他平台使用当前部署目标版本

实际应用场景

swift
// 1. 新 API 的兼容性处理
func setupPasskeys() {
    if #available(iOS 16.0, *) {
        // 使用 iOS 16+ 的 Passkeys API
        let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(relyingPartyIdentifier: rpId)
        let request = provider.createCredentialRegistrationRequest(
            challenge: challengeData,
            name: userName,
            userID: userIdData
        )
        performPasskeyAuthentication(request)
    } else {
        // 降级到传统密码登录
        showPasswordLogin()
    }
}

// 2. UI 组件的版本适配
func setupUI() {
    if #available(iOS 15.0, *) {
        // 使用 iOS 15+ 的新 UI 组件
        let button = UIButton(configuration: .filled())
        button.configuration?.title = "登录"
    } else {
        // 使用传统的 UIButton 设置
        let button = UIButton(type: .system)
        button.setTitle("登录", for: .normal)
        button.backgroundColor = .systemBlue
    }
}

// 3. 多平台版本检查
func setupCrossplatform() {
    if #available(iOS 14.0, macOS 11.0, watchOS 7.0, tvOS 14.0, *) {
        // 所有平台都支持的新功能
        useNewFeature()
    } else {
        // 兜底方案
        useOldFeature()
    }
}

与 @available 的区别

swift
// @available - 标记函数/类的可用性
@available(iOS 16.0, *)
func createPasskey() {
    // 这个函数只在 iOS 16+ 可用
}

// #available - 运行时检查版本
func someFunction() {
    if #available(iOS 16.0, *) {
        createPasskey()  // 只有在 iOS 16+ 才调用
    }
}

常见的版本检查模式

swift
// 模式1:功能降级
func authenticateUser() {
    if #available(iOS 16.0, *) {
        // 优先使用 Passkeys
        setupPasskeys()
    } else if #available(iOS 13.0, *) {
        // 次选使用 Face ID/Touch ID
        setupBiometrics()
    } else {
        // 最后使用密码
        setupPasswordAuth()
    }
}

// 模式2:错误提示
func checkCompatibility() {
    guard #available(iOS 16.0, *) else {
        showAlert(message: "此功能需要 iOS 16 或更高版本")
        return
    }

    // 继续执行 iOS 16+ 的代码
    enableAdvancedFeatures()
}

// 模式3:条件编译结合
#if swift(>=5.7)
    if #available(iOS 16.0, *) {
        // Swift 5.7 + iOS 16 的最新功能
    }
#endif

实际项目中的最佳实践

swift
class AuthenticationManager {

    func register(_ options: String, callback: @escaping (String) -> Void) {
        // 版本检查应该在功能入口处进行
        guard #available(iOS 16.0, *) else {
            callback(errorJSON("iOS 16+ required for Passkeys"))
            return
        }

        // 继续执行 Passkeys 注册逻辑
        performPasskeyRegistration(options, callback)
    }

    private func performPasskeyRegistration(_ options: String, _ callback: @escaping (String) -> Void) {
        // 这里可以安全使用 iOS 16+ API,因为已经检查过版本
        let provider = ASAuthorizationPlatformPublicKeyCredentialProvider(relyingPartyIdentifier: rpId)
        // ...
    }

    private func errorJSON(_ message: String) -> String {
        return """
        {
            "ok": false,
            "errMsg": "\(message)"
        }
        """
    }
}

switch 语句

swift
let grade = "B"

switch grade {
case "A":
    print("非常好")
case "B":
    print("良好")
case "C":
    print("及格")
default:
    print("不及格")
}

特点:

  • 必须覆盖所有情况,否则要写 default
  • 无需写 break,匹配后自动退出。

switch 的进阶用法

swift
let point = (1, 1)

switch point {
case (0, 0):
    print("原点")
case (let x, 0):
    print("在 X 轴上,x=\(x)")
case (0, let y):
    print("在 Y 轴上,y=\(y)")
case (-2...2, -2...2):
    print("在 (-2,2) 范围内")
default:
    print("其他位置")
}

Swift 的 switch 很强大,支持区间、元组、条件匹配。

while 循环

swift
var n = 3
while n > 0 {
    print(n)
    n -= 1
}

repeat-while 循环(至少执行一次)

swift
var m = 0
repeat {
    print("执行一次:m=\(m)")
    m += 1
} while m < 3

for-in 循环

swift
for i in 1...5 {  // 闭区间,包含 5
    print(i)
}

for i in 1..<5 {  // 半开区间,不包含 5
    print(i)
}

let names = ["Alice", "Bob", "Charlie"]
for name in names {
    print("Hello, \(name)")
}

控制跳转

swift
for i in 1...5 {
    if i == 3 {
        continue   // 跳过当前循环
    }
    if i == 4 {
        break      // 提前结束循环
    }
    print(i)
}

小结

  • if-else:最常见的条件判断。
  • switch:比很多语言更强大,支持模式匹配。
  • 循环包括 whilerepeat-whilefor-in,最后一个最常用。
  • continuebreak 用于跳转控制。

本站总访问