⚠️

swift-dependenciesでSwift 6の警告が出る場合の対処法

2025/02/01に公開

概要

Swift DependenciesライブラリのUUIDGeneratorDateGeneratorを使用した際に、以下のようなSwift6の警告が発生したため、それを直す方法の備忘録を記載します。

Swift6の警告
Type 'WritableKeyPath<DependencyValues, DateGenerator>' does not conform to the 'Sendable' protocol; this is an error in the Swift 6 language mode

Generic class 'WritableKeyPath' does not conform to the 'Sendable' protocol (Swift.WritableKeyPath)

結論

InferSendableFromCapturesのUpComingFutureフラグを有効化する

Package.swift
// swift-tools-version:6.0
import PackageDescription

let package = Package(
    name: "server",
    platforms: [
        .macOS(.v15)
    ],
    dependencies: [
        .package(url: "https://github.com/pointfreeco/swift-dependencies.git", from: "1.0.0"),
    ],
    targets: [
        .executableTarget(
            name: "App",
            dependencies: [
                .product(name: "Dependencies", package: "swift-dependencies"),
            ],
            swiftSettings: swiftSettings
        ),
    ]
)

var swiftSettings: [SwiftSetting] {
    [
        .enableUpcomingFeature("DisableOutwardActorInference"),
        .enableExperimentalFeature("StrictConcurrency"),
        .enableUpcomingFeature("InferSendableFromCaptures"), // 追加
    ]
}

解説

KeyPathsubscriptで非Sendableな値を参照する可能性があり、Swift6ではスレッド間の安全性が保証されないとして警告が出ることがあります。(実際にswift-dependenciesでは型や値を参照しています)

そこで、InferSendableFromCapturesフラグを有効化することで、コンパイルが「部分適用されたメソッド」やKeyPathなどがSendableかを自動的に推論されるようになります。

このフラグを有効にすると、コンパイラがKeyPath内で参照される型や値がSendableかどうかを自動推論し、安全な場合には警告を抑制します。

参考: https://github.com/swiftlang/swift-evolution/blob/main/proposals/0418-inferring-sendable-for-methods.md

まとめ

InterSendableFromCapturesは、並行安全性を緩めることなく不要な警告を抑えてくれるため、とりあえず入れておいても問題なさそうです。swift-dependenciesを導入する際にはついでにこちらのFutureフラグを有効化しておいた方がおすすめです。

Discussion