Appearance
Swift 入门(4):流程控制(if、switch、循环)
程序的核心就是控制执行流程。Swift 提供了清晰的条件判断和循环语法,语义直观,易读易写。
if 条件语句
swift
let score = 85
if score >= 90 {
print("优秀")
} else if score >= 60 {
print("及格")
} else {
print("不及格")
}注意:条件表达式必须是布尔值,不能像 C 那样用
1或0。
版本兼容性检查:#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 < 3for-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:比很多语言更强大,支持模式匹配。- 循环包括
while、repeat-while、for-in,最后一个最常用。 continue和break用于跳转控制。