Beton

Beton 是一个基于 Swift 构建于 Foundation 框架之上的库,它提供了额外的功能层,包括简易本地化、性能测试测量支持和便利的功能。 对我们来说,Beton 主要(但不完全)用于服务器端 Swift 工程。

模块

使用 Beton 模块

导入

要使用 Beton,只需导入它。 如果您需要来自 Foundation 的任何内容,则无需显式导入它。 通过导入 Beton,您可以免费获得它。

import Beton

Bundle 的便捷 API

使用 Beton,可以非常容易地从本地化 Bundle 中获取本地化的 Bundle 和值。

假设您的项目中的 hu_HU 语言环境有一个本地化 Bundle,其中 "Apple" = "Alma" 的翻译,但您没有 "Banana" 的翻译(应该是 "Banán")。 以下示例查找 Bundle,获取 "Apple" 的本地化版本,并回退到给定的键 "Banana"

let bundle          = Bundle.module.localizationBundles["hu_HU"]
let localizedApple  = bundle?.localizedString("Apple")
// localizedApple == "Alma"
let localizedBanana = bundle?.localizedString("Banana")
// localizedBanana == "Banana"

Locale 的便捷 API

Beton 中的 Locale 可以用字符串字面量表示。

let locales: [Locale] = ["en_US", "en_GB", "hu_HU"]
for locale in locales {
  print("Currency symbol: \(locale.currencySymbol ?? "N/A")")
}
// Prints:
// Currency symbol: $
// Currency symbol: £
// Currency symbol: Ft

?! 运算符

如果 ?! 运算符解包一个 Optional 值不是 nil,否则抛出给定的错误。

struct GenericError: Error {}

let answer = try Int("42") ?! GenericError()
// answer == 42

try Int("NaN") ?! GenericError()
// Throws: GenericError()

sumSequence 上的扩展

计算序列中所有元素的总和。 适用于任何具有符合 AdditiveArithmetic 的值的序列。

let arraySum = [1.1, 2.2, 3.3, 4.4, 5.5].sum()
// arraySum == 16.5

let rangeSum = (1..<10).sum()
// rangeSum == 45

let setSum = Set(arrayLiteral: 1, 2, 3, 2, 3).sum()
// setSum == 6

Measurement 的便利功能

Beton 中,Measurement 具有默认单位,并且它们符合 AdditiveArithmetic

let sum = [1, 2, 3].map { Measurement<UnitLength>(value: $0, unit: .default) }.sum()
// sum == 6.0 m

使用 XCTBeton 模块

假设您有一个简单的性能测试来测量一些代码。 使用 XCTest,没有简单、直接的方法来对性能结果进行断言。

import XCTest

class PerformanceTests: XCTestCase {
  func test_measureSum() {
    measure {
      let _ = (1..<1000).reduce(0, +)
    }
    // Performance assertions needed!
  }
}

您可以通过简单地更改导入将此代码转换为 XCTBeton 测试。 是的,就是这样。 您现在可以进行断言了!

import XCTBeton

class PerformanceTests: XCTestCase {
  func test_measureSum() {
    measure {
      let _ = (1..<1000).reduce(0, +)
    }
    XCTAssertMetric(.clock, .timeMonotonic, .average(maximum: 0.001))
  }
}

如果您想控制测量的类型以及测试运行的次数,您可以使用与常规 XCTest 中相同的 API 来完成。

import XCTBeton

class PerformanceTests: XCTestCase {
  func test_measureSum() {
    let options = XCTMeasureOptions()
    options.iterationCount = 100
    measure(metrics: [XCTCPUMetric(), XCTMemoryMetric()], options: options) {
      let _ = (1..<1000).reduce(0, +)
    }
    XCTAssertMetric(.cpu, .time, .average(maximum: 0.002))
    XCTAssertMetric(.cpu, .cycles, .average(maximum: 2000))
    XCTAssertMetric(.memory, .physical, .average(maximum: 20))
  }
}

添加 Beton 作为依赖项

要在 SwiftPM 项目中使用 Beton 库,请将其添加到您的软件包和目标的依赖项中。 您的目标可以依赖 BetonXCTBeton 模块,或两者都依赖。

// swift-tools-version:5.5.0

import PackageDescription

let package = Package(
  name: "MyApplication",
  dependencies: [
    .package(url: "https://github.com/21GramConsulting/Beton", from: "1.0.0"),
  ],
  targets: [
    .target(name: "MyApplication", dependencies: [
      .product(name: "Beton", package: "Beton"),
      .product(name: "XCTBeton", package: "Beton"),
    ])
  ]
)