我正在使用 Swift 包管理器,版本为 Swift 5.7.1。我想用正则表达式文字编译代码。例如,
main.swift
可以如下所示:
let message = "Hello, world"
print(message.replacing(/[aeiou]/, with: "[vowel]"))
我目前对输出不感兴趣,而是对编译感兴趣。
如果我在 XCode 中创建一个项目,它就可以正常工作。但是,如果我在 Swift 包管理器中尝试它(使用
swift build
),它显然无法识别 /[aeiou]/
是正则表达式文字。相反,我收到类似 '/' is not a prefix unary operator
的消息。
有什么方法可以让它与 Swift 包管理器一起使用,或者只是尚不支持?
Swift 5.7 的正则表达式文字可以在使用 Swift 包管理器时工作,但必须在您的
Package.swift
中显式启用它们。默认情况下,新语法被禁用,因为它是一种破坏源代码的语言更改(由于注释语法中现有使用“/”和运算符 /
运算符)。
这是一个说明性的
Package.swift
,它为所有包目标设置“-enable-bare-slash-regex”。如果您正在努力完全采用 Swift 5.7,我还提供了一些您可能需要的附加设置:
// swift-tools-version: 5.7
import PackageDescription
let package = Package(
name: "your-package-name",
platforms: [...],
dependencies: [...],
targets: [
.target(
name: "FooBar",
dependencies: []
),
.testTarget(
name: "FooBarTests",
dependencies: [
"FooBar",
]
),
]
)
for target in package.targets {
target.swiftSettings = target.swiftSettings ?? []
target.swiftSettings?.append(
.unsafeFlags([
"-Xfrontend", "-warn-concurrency",
"-Xfrontend", "-enable-actor-data-race-checks",
"-enable-bare-slash-regex",
])
)
}
在未来的 Swift 版本中,一旦现有代码有时间过渡到 Swift 5.7,正则表达式文字可能会默认启用。
Swift 5.8 更新
enableUpcomingFeature
有助于避免出现以下情况: “使用不安全标志使包含此目标的产品不适合其他软件包使用”。
let swiftSettings: [SwiftSetting] = [
// -enable-bare-slash-regex becomes
.enableUpcomingFeature("BareSlashRegexLiterals"),
// -warn-concurrency becomes
.enableUpcomingFeature("StrictConcurrency"),
.unsafeFlags(["-enable-actor-data-race-checks"],
.when(configuration: .debug)),
]
for target in package.targets {
target.swiftSettings = target.swiftSettings ?? []
target.swiftSettings?.append(contentsOf: swiftSettings)
}