如何在非函数体内为变量使用#available(iOS 16.0, *)?
解决iOS版本低于15.0时不编译requestReview环境变量的问题
因为#available是运行时版本检查指令,无法直接用于控制变量的编译与否,你需要用Swift的条件编译指令实现编译时的版本控制:
方案一:条件编译控制变量声明
直接通过#if指令判断iOS版本,只在iOS 15.0及以上版本编译requestReview环境变量:
struct HomeView11labs: View { // 仅在iOS 15.0及以上编译该环境变量 #if os(iOS) && iOS >= 150000 @Environment(\.requestReview) var requestReview: RequestReviewAction #endif var body: some View { VStack { Button("申请评价") { // 使用变量时同样要加条件编译,避免低版本报错 #if os(iOS) && iOS >= 150000 requestReview() #endif } } } }
注:iOS版本号在条件编译中需用整数格式,比如15.0对应
150000,16.1对应160100。
方案二:可选类型兼容(非编译时剔除)
若不需要完全剔除代码,仅需避免低版本运行错误,可将变量声明为可选类型,结合#available在运行时判断调用:
struct HomeView11labs: View { @Environment(\.requestReview) var requestReview: RequestReviewAction? var body: some View { Button("申请评价") { if #available(iOS 15.0, *) { requestReview?() } } } }
这种方式会在所有版本编译变量,但低版本中变量值为nil,通过运行时检查避免调用错误。
内容的提问来源于stack exchange,提问作者Nat Serrano
相关产品推荐
相关产品推荐

