By AI: Swift6.1新特性

274 阅读1分钟

原文链接

www.donnywals.com/whats-new-i…

翻译总结

1. TaskGroup 的改进
  • 新特性: Swift 6.1 中,TaskGroup 的返回类型可以自动推断,无需显式指定。

  • 示例 1: 自动推断返回类型

    await withTaskGroup { group in
      for _ in 1...10 {
        group.addTask {
          return Int.random(in: 1...10) // 编译器推断返回类型为 Int
        }
      }
    }
    
  • 示例 2: 返回类型不一致会报错

    await withTaskGroup { group in
      group.addTask {
        return Int.random(in: 1...10) // 返回 Int
      }
      group.addTask {
        return "Hello, world" // 返回 String,编译器报错
      }
    }
    
  • 示例 3: 使用枚举支持多返回类型

    enum TaskResult {
      case number(Int)
      case text(String)
    }
    
    await withTaskGroup(of: TaskResult.self) { group in
      group.addTask {
        return .number(Int.random(in: 1...10))
      }
      group.addTask {
        return .text("Hello, world")
      }
    }
    
2. 导入成员可见性改进
  • 新特性: Swift 6.1 引入了新的成员可见性模式,允许开发者控制导入模块的扩展可见性。

  • 示例 1: 不同模块中的同名扩展

    // CurrencyKit 模块
    extension Int {
      func price() -> String {
        return "$(self)"
      }
    }
    
    // PurchaseParser 模块
    extension Int {
      func price() -> Double {
        return Double(self) / 100.0
      }
    }
    
    // 主模块
    import CurrencyKit
    import PurchaseParser
    
    let amount = 1000
    let priceString: String = amount.price() // 明确指定返回类型,避免歧义
    
  • 示例 2: 启用 MemberImportVisibility 特性

    // Swift Package 配置
    .executableTarget(
        name: "AppTarget",
        dependencies: [
            "CurrencyKit",
            "PurchaseParser"
        ],
        swiftSettings: [
            .enableExperimentalFeature("MemberImportVisibility")
        ]
    )
    
    // 主模块
    import CurrencyKit
    
    let amount = 1000
    let priceString = amount.price() // 只能使用 CurrencyKit 中的扩展
    
  • 示例 3: 未启用特性时的行为

    import CurrencyKit
    
    let amount = 1000
    let priceString = amount.price() // 如果未启用 MemberImportVisibility,可能误用 PurchaseParser 的扩展
    

总结

Swift 6.1 的主要改进包括:

  1. TaskGroup 的自动类型推断:简化了并发代码的编写。
  2. 导入成员可见性控制:通过 MemberImportVisibility 特性,避免不同模块中同名扩展的冲突,提升代码的可维护性。

这些改进虽然看似小,但在实际开发中能显著提升开发效率和代码质量