⚠️
swift-dependenciesでSwift 6の警告が出る場合の対処法
概要
Swift DependenciesライブラリのUUIDGenerator
やDateGenerator
を使用した際に、以下のような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"), // 追加
]
}
解説
KeyPath
はsubscript
で非Sendable
な値を参照する可能性があり、Swift6ではスレッド間の安全性が保証されないとして警告が出ることがあります。(実際にswift-dependencies
では型や値を参照しています)
そこで、InferSendableFromCaptures
フラグを有効化することで、コンパイルが「部分適用されたメソッド」やKeyPath
などがSendableかを自動的に推論されるようになります。
このフラグを有効にすると、コンパイラがKeyPath
内で参照される型や値がSendable
かどうかを自動推論し、安全な場合には警告を抑制します。
まとめ
InterSendableFromCaptures
は、並行安全性を緩めることなく不要な警告を抑えてくれるため、とりあえず入れておいても問題なさそうです。swift-dependencies
を導入する際にはついでにこちらのFutureフラグを有効化しておいた方がおすすめです。
Discussion