此仓库包含对 Foundation、UIKit 和 SwiftUI 的有用扩展
将 @dynamicMemberLookup
与 KeyPath
和 callAsFunction
结合使用
let label = UILabel()~
.text("Text")
.textColor(.red)
.font(.system(24))
.apply()
Date
结构体提供的功能非常有限,任何日期操作都必须通过 Calendar
实现,方式非常不直观、复杂且难以记住。 为了简化日期操作,此库提供了一种简单直观的语法。
let afterTomorrow: Date = .today + 2.days
//or .today + .days(2)
//or Date.today.adding(2 * .day)
let difference = date2 - date1
let daysBetweenDates = difference.days
//or date2.interval(of: .day, from: date1)
let weeksBetweenDates = difference.weeks
let hours = Date().component(.hour)
//or Date().hour()
let someDate = Date(year: 1994, month: 10, day: 4)
let startOfMonth = Date().start(of: .month)
let lastMonth = Date().end(of: .year)
let lastDay = Date().end(of: .year, accuracy: .day)
let nextYear = Date().next(.year)
let nextLeapYear = Date().nearest([.month: 2, .day: 29], in: .future)?.start(of: .year)
let monthLenght = Date().count(of: .day, in: .month)
for month in (date1...date2).each(.month) {...}
let weekdayName = Date().name(of: .weekday)
if let date = Date(from: dateString, format: "dd.MM.yyyy") {...}
let dateString = Date().string("dd.MM.yyyy")
let iso860String = Date().iso860
let defaultDateString = Date().string(date: .long, time: .short)
let relativeDateString = Date().string("dd.MM.yyyy",
relative: [
.day(1): "Tomorrow",
.day(0): "Today, HH:mm",
.day(-1): "Yesterday",
.week(0): "EEEE",
.year(0): "dd.MM"
]
)
任何函数都包含带有默认值的附加参数,例如
calendar: Calendar = .default
locale: Locale = .default
timezone: TimeZone = .default
其中 Calendar.default
、Locale.default
和 TimeZone.default
是您可以更改的静态变量。 因此,您可以在每个函数中使用自定义 Calendar
let dayOfMonth = Date().position(of: .day, in: .month, calendar: customCalendar)
或者您可以为所有函数设置您自己的 default
值
Calendar.default = customCalendar
ArrayBuilder<T>
- 用于创建数组的结果构建器ComposeBuilder
SingleBuilder
轻松将 UIKit
元素集成到 SwiftUI
代码中。 此实现使用 @autoclosure
以避免 UIView
重新创建。 §
运算符创建 UIKitView
,UIKitView
支持 链接 以更新 UIView
。 .uiKitViewEnvironment
修饰符允许通过链接将 UIView
的属性设置为环境。
@State var text: String
let textColor: Color
var body: some View {
VStack {
Text(text)
.foregroundColor(textColor)
UILabel()§
.text(text)
.contentPriority.horizontal.compression(.required)
UIKitView {
UILabel()
} update: { label, context in
label.text = text
}
UIImageView()
}
.uiKitViewEnvironment(for: UILabel.self)
.textColor(textColor.ui)
.tintColor(.red)
}
通过函数构建器和 chaining
实现的 UIKit
类似 SwiftUI
语法
class YourView: LtView {
@SubviewsBuilder
override func layout() -> [SubviewProtocol] {
UIStackView(.vertical) {
UILabel()~
.textColor(.black)
.font(.systemFont(ofSize: 20))
someView {
someImageView~
.image(someImage)
}
Text("SubviewsBuilder supports SwiftUI views too")
}
}
}
VDLayout
非常适合与 ConstraintsOperators
结合使用,只需使 Constraints<Item>
实现 SubviewProtocol
即可
UIView {
label
.height(30)
.width(someView.width / 2 + 10)
.centerX(0)
.edges(.vertical).equal(to: 10)
}
view.environments.someValue = 0
extension UIViewEnvironment {
var someValue: Int {
get { self[\.someValue] ?? 0 }
set { self[\.someValue] = newValue }
}
}
创建一个 Package.swift
文件。
// swift-tools-version:5.0
import PackageDescription
let package = Package(
name: "SomeProject",
dependencies: [
.package(url: "https://github.com/dankinsoid/VDKit.git", from: "1.193.0")
],
targets: [
.target(name: "SomeProject", dependencies: ["VDKit"])
]
)
$ swift build
dankinsoid, voidilov@gmail.com
VDAnimation 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。