一个用于在不同大小写和格式之间转换文本的库。
import Kebab
let con = CaseConverter()
con.convert(text: "CaseConverter", from: .PascalCase, to: .snake_case) // case_converter
con.convert(text: "case_converter", from: .snake_case, to: .screamingKebabCase) // CASE-CONVERTER
Kebab
支持以下来自维基百科 多词标识符格式示例 中的格式
格式化 | 名称 |
---|---|
twowords | 扁平式 |
TWOWORDS | 大写扁平式 |
twoWords | (小写) 驼峰式, dromedaryCase |
TwoWords | 帕斯卡式, 大驼峰式, StudlyCase |
two_words | 蛇底式, pothole_case |
TWO_WORDS | 啸叫蛇底式, MACRO_CASE, 常量式 |
two_Words | 驼峰蛇底式 |
Two_Words | 帕斯卡蛇底式 |
two-words | 短横线式, dash-case, lisp-case |
two|words | doner|case |
TWO-WORDS | 火车式, COBOL-CASE, 啸叫短横线式 |
Two-Words | 火车式, HTTP-Header-Case |
MultiwordIdentifier
定义输入和输出转换格式。枚举类型尽可能定义与其大小写格式匹配的类型
public enum MultiWordIdentifier {
case flatcase // flatcase
case UPPERFLATCASE // UPPERFLATCASE
case camelCase // camelCase
case PascalCase // PascalCase
case snake_case // snake_case
case MACRO_CASE // MACRO_CASE
case camel_Snake_Case // camel_Snake_Case
case Pascal_Snake_Case // Pascal_Snake_Case
case kebabCase // kebak-case
case trainCase // Train-Case
case cobolCase // COBOL-CASE
case donerCase // doner|case
}
为了方便起见,还定义了以下别名
extension MultiWordIdentifier {
public static let lowerCamelCase = Self.camelCase // lowerCamelCase
public static let dromedaryCase = Self.camelCase // dromedaryCase
public static let UpperCamelCase = Self.PascalCase // UpperCamelCase
public static let StudlyCase = Self.PascalCase // StudlyCase
public static let pothole_case = Self.snake_case // pothole_case
public static let SCREAMING_SNAKE_CASE = Self.MACRO_CASE // SCREAMING_SNAKE_CASE
public static let CONSTANT_CASE = Self.MACRO_CASE // CONSTANT_CASE
public static let spineCase = Self.kebabCase // spine-case
public static let dashCase = Self.kebabCase // dash-case
public static let lispCase = Self.kebabCase // lisp-case
public static let httpHeaderCase = Self.trainCase // Http-Header-Case
public static let screamingKebabCase = Self.cobolCase // SCREAMING-KEBAB-CASE
public static let screamingTrainCase = Self.cobolCase // SCREAMING-TRAIN-CASE
}
CaseConverter
是该库的核心,允许在上面列出的所有格式之间进行转换。 请注意,转换为 flatcase
或 UPPERFLATCASE
格式是不可逆的。
import Kebab
let con = CaseConverter()
con.convert(text: "CaseConverter", from: .PascalCase, to: .flatcase) // caseconverter
con.convert(text: "caseconverter", from: .flatcase, to: .PascalCase) // Caseconverter ⚠️
CaseConverter
也可以将纯文本作为输入。 此过程将根据格式将任何非字母数字字符替换为适当的分隔符(或无分隔符)。
import Kebab
let con = CaseConverter()
con.convert(text: "A Title for a 100 Blog Post!", from: .plainText, to: .kebabCase)
// a-title-for-a-100-blog-post
连续的分隔符将被删除。
import Kebab
let con = CaseConverter()
con.convert(text: "Too much $$$ I would say!!", from: .plainText, to: .snake_case)
// too_much_i_would_say
虽然指示输入格式是更可取的(性能更高),但 Kebab
提供了大小写检测器。
import Kebab
let detector = CaseDetector()
detector.detectCase(in: "this-is-kebab-case") // .kebabCase
detector.detectCase(in: "SOME_CONSTANT") // .MACRO_CASE
这允许在不必提供输入格式的情况下使用 CaseConverter
(会增加性能损失)。
import Kebab
let con = CaseConverter()
con.convert(text: "this-is-kebab-case", to: .camelCase) // thisIsKebabCase
为了方便起见,单独的模块 KebabExtensions
提供了 String
的扩展,用于转换和大小写检测。
import KebabExtensions
"Some-Http-Header".converted(to: .donerCase) // some|http|header
"GoodOldPascalCase".converted(to: .SCREAMING_SNAKE_CASE) // GOOD_OLD_PASCAL_CASE
"This_Is_Pascal_Snake_Case".detectCase() // .Pascal_Snake_Case
camelCase
(默认)和 snake_case
键编码/解码策略都包含在 Foundation
中,因此该库不提供它们。
但是,此库提供用于处理 JSON 负载的键编码/解码策略,这些键以 PascalCase
或 kebab-case
编码。 这些包含在模块 KebabJSON
中。
import KebabJSON
struct Dto: Codable {
let propertyName: String
let anotherProperty: Int
// Note the lack of custom coding keys
}
let json = """
{
"property-name": "Property Value",
"another-property": 42
}
"""
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromKebabCase // decode `kebab-case` keys
let dto = try decoder.decode(Dto.self, from: Data(json.utf8))
let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToPascalCase // encode `PascalCase` keys
let data = try encoder.encode(dto)
// { "PropertyName": "Property Value", "AnotherProperty": 42 }
将 Kebab
添加到您的 Swift 包
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "YourProject",
dependencies: [
.package(url: "https://github.com/eneko/Kebab", from: "1.0.0"),
]
)
Swift 5.0+
MIT
Twitter: @eneko