Swift 包管理器支持正则表达式吗?

问题描述 投票:0回答:1

我正在使用 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 regex swift-package-manager
1个回答
21
投票

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 更新

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)
}
© www.soinside.com 2019 - 2024. All rights reserved.