一个 µ-framework,用于表示、比较、编码和使用 语义化版本,例如 1.2.3
或 2.0.0-beta
。
这是来自 Swift Package Manager 的 Version.swift
,进行了一些小的调整
Codable
实现 †LosslessStringConvertible
‡Bundle
和 ProcessInfo
提供的扩展ExpressibleByStringLiteral
一致性10.0
或 v3
的用户输入Range<Version>
实现StringProtocol
初始化,而不仅仅是 String
我们对 Apple 仓库的更改进行自动监控,以便在我们需要合并任何修复时发出警报。
† 语义化版本 可以无损地表示为字符串;因此我们这样做。
‡ 就像
Int
一样,我们可以从有效的字符串中无损地存储语义化版本,因此我们遵循相同的协议。
大家好,我是 Max Howell。我是一位多产的开源软件开发者,您可能已经在使用我的一些软件(例如,我创建了 brew
)。我全职从事开源工作,这很辛苦;目前 *我的收入低于最低工资*。请帮助我继续我的工作,我非常感谢 🙏🏻
import Version
// these two initializers are the same, use whichever suits the code context
let v1 = Version(1,0,0)
let v2 = Version(major: 1, minor: 0, patch: 0)
let v3 = Version("1.2.3") // => 1.2.3: Version?
let v4 = Version(tolerant: "10.1") // => 10.1.0: Version?
let v5 = Version(tolerant: "10") // => 10.0.0: Version?
// a real Version object from your app’s Info.plist
let v6 = Bundle.main.version
let range = Version(1,2,3)..<Version(2,0,0)
let null: Version = .null // => Version(0,0,0)
let foo = Version(1,2,3) < Version(2,0,0) // => true
SwiftPM
package.append(.package(url: "https://github.com/mxcl/Version.git", from: "2.0.0"))
Carthage
等待中:@Carthage#1945。
范围的工作方式符合您的预期,但对于预发布标识符有一些注意事项,以下是规则
1.0.0..<2.0.0
不包括例如2.0.0-alpha
这可能符合您的预期。但是
1.0.0..<2.0.0
也不包括例如1.5.0-alpha
然而
1.0.0..<2.0.0-beta
**确实** 包括例如2.0.0-alpha
这是大多数语义化版本库的工作方式。
根据规范,comparable 和 equatable 都会忽略构建元数据。因此
Version("1.2.3+14") == Version("1.2.3+15") // => true
Version("1.2.3+14") <= Version("1.2.3+15") // => true
Version("1.2.3+14") < Version("1.2.3+15") // => false
这也意味着 Hashable
必须反映此行为,因此
dict[Version("1.2.3+14")] = 1
dict[Version("1.2.3+15")] = 2
dict.count // => 1
dict // => ["1.2.3+15": 2]
请注意这一点,因为它可能会让您措手不及,自然地,这也会影响依赖于 Hashable
的结构,例如 Set
。