VDKit

CI Status Version License Platform

描述

此仓库包含对 Foundation、UIKit 和 SwiftUI 的有用扩展

用法

VDChain

@dynamicMemberLookupKeyPathcallAsFunction 结合使用

let label = UILabel()~
  .text("Text")
  .textColor(.red)
  .font(.system(24))
  .apply()

VDDates

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.defaultLocale.defaultTimeZone.default 是您可以更改的静态变量。 因此,您可以在每个函数中使用自定义 Calendar

let dayOfMonth = Date().position(of: .day, in: .month, calendar: customCalendar)

或者您可以为所有函数设置您自己的 default

Calendar.default = customCalendar

VDBuilders

UIKitIntegration

轻松将 UIKit 元素集成到 SwiftUI 代码中。 此实现使用 @autoclosure 以避免 UIView 重新创建。 § 运算符创建 UIKitViewUIKitView 支持 链接 以更新 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)
}

VDLayout

通过函数构建器和 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)
}

UIKitEnvironment

view.environments.someValue = 0

extension UIViewEnvironment {
  var someValue: Int {
    get { self[\.someValue] ?? 0 }
    set { self[\.someValue] = newValue }
  }
}

安装

  1. Swift Package Manager

创建一个 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 文件。