GrayCore
安装
GrayCore 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中即可
pod 'GrayCore'
用法
CustomError
这是一个非常简单但很有用的 errors,其中包含一个字符串。
let error: Error = CustomError(message: "Error description")
print(error.localizedDescription)
Formatter
Formatter 是一个类,包含用于格式化数据的静态方法。
电话
电话格式化程序将获取一个字符串,移除所有非数字字符并返回格式化后的结果。
var result = Formatter.format(phone: "11988887777")
print(result) // "(11) 98888-7777"
result = Formatter.format(
phone: "551188887777",
addPlusSign: true,
countryCodeDigits: 2,
areaCodeDigits: 2,
leftDigits: 4,
rightDigits: 4
)
print(result) // "+55 (11) 8888-7777"
路由器
路由器可以从Storyboard文件中实例化初始视图控制器。因为它使用泛型,所以会尝试将其转换为告知的类类型。
let router = Router()
let path = RouterPath(rawValue: "Scene")
let destination: SceneViewController? = router.destination(for: path)
RouterPath是具有Storyboard名称的组件,可以轻松扩展以获得更好的代码。
extension RouterPath {
public static var Scene: RouterPath {
return RouterPath(rawValue: "Scene")
}
}
let router = Router()
let destination: SceneViewController? = router.destination(for: .Scene)
验证器
验证器是一个具有静态方法的类,用于验证数据。
电子邮件
let result = Validator.isValid(email: "[email protected]")
print(result) // true
电话
var result = Validator.isValid(phone: "(11) 98888-7777")
print(result) // true
result = Validator.isValid(
phone: "+55 (11) 8888-7777",
formatted: true,
internationalNumber: true,
areaCodeRange: "2",
leftRange: "4,5",
rightRange: "4"
)
print(result) // true
ViewModel
ViewModel类被设计得简单但非常灵活和强大。它只有3个方法
- bind(_ 监听器: @escaping (T?) -> Void)
- set(data: T?)
- update(block: (T?) -> T?)
绑定
使用绑定设置一个闭包,每次在ViewModel上设置新数据时都会执行。它将以数据本身作为参数进行调用。
设置
此功能用于替换ViewModel上的当前数据。更新属性后,它将触发绑定方法。
更新
如果你想仅更改几个属性而不是整个对象,可以调用更新函数,并返回一个包含数据作为参数的闭包。使用它后,你只需更改所需的内容,然后ViewModel将触发绑定方法。
示例
import UIKit
import GrayCore
class Counter {
var title: String
var currentValue: Int
init(title: String, currentValue: Int) {
self.title = title
self.currentValue = currentValue
}
}
class ViewController: UIViewController {
var viewModel: ViewModel<Counter> = ViewModel()
@IBOutlet private weak var titleLabel: UILabel!
@IBOutlet private weak var currentValueLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
viewModel.bind { counter in
self.updateUI(counter: counter)
}
updateUI(counter: nil)
}
func updateUI(counter: Counter?) {
let empty = "-"
titleLabel.text = counter?.title ?? empty
var value = empty
if let currentValue = counter?.currentValue {
value = "\(currentValue)"
}
currentValueLabel.text = value
}
@IBAction private func resetButtonTouchUpInside(_ sender: UIButton) {
viewModel.set(data: Counter(title: "Counter", currentValue: 0))
}
@IBAction private func incrementButtonTouchUpInside(_ sender: UIButton) {
viewModel.update { counter in
counter?.currentValue += 1
}
}
@IBAction private func decrementButtonTouchUpInside(_ sender: UIButton) {
viewModel.update { counter in
counter?.currentValue -= 1
}
}
}
作者
Gray Company [email protected]
许可协议
GrayCore 在MIT许可下可用。更多信息请参见LICENSE文件。