Beton
是一个基于 Swift 构建于 Foundation 框架之上的库,它提供了额外的功能层,包括简易本地化、性能测试测量支持和便利的功能。 对我们来说,Beton
主要(但不完全)用于服务器端 Swift 工程。
要使用 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
的便捷 APIBeton
中的 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()
sum
在 Sequence
上的扩展计算序列中所有元素的总和。 适用于任何具有符合 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
假设您有一个简单的性能测试来测量一些代码。 使用 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))
}
}
要在 SwiftPM 项目中使用 Beton
库,请将其添加到您的软件包和目标的依赖项中。 您的目标可以依赖 Beton
或 XCTBeton
模块,或两者都依赖。
// 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"),
])
]
)