Swift 声明式配置 (简称 SDC) 是一个小型库,它使您能够以声明式、一致且易于理解的方式配置对象,并兼顾人体工程学。它可以用于在任何平台上配置任何对象,包括服务端 Swift。
提供用于复制和修改不可变对象的修改函数。 当修改方法应返回修改后的 self
时,它对于像构建器这样的自配置对象非常有用。
Functional Key Path 包装器。
适用于任何对象的 Functional 配置器,使您能够指定对象的修改并在以后应用修改。
还包含自实现协议 (ConfigInitializable
、CustomConfigurable
) ,使您能够为您的类型添加自定义配置支持 (NSObject
已经为您实现了该协议)。
适用于任何对象的 Functional 构建器,使您能够以声明式方式修改对象实例。 还包含具有计算属性 builder
的 BuilderProvider
协议,并在 NSObject
类型上实现该协议。
Functional 闭包允许您设置 functional handlers & datasources,API 乍一看可能有点奇怪,所以请随时提出问题或在此处讨论。
包装并导出所有产品。
更多内容请参见测试
class ImageViewController: UIViewController {
let imageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFit
imageView.backgroundColor = .black
imageView.layer.masksToBounds = true
imageView.layer.cornerRadius = 10
return imageView
}()
override func loadView() {
self.view = imageView
}
}
注意: 这种方式是 推荐的,但请记住,即使超类已经有无参数初始化器,自定义类型必须实现无参数初始化器,否则你会得到一个崩溃。
import FunctionalConfigurator
class ImageViewController: UIViewController {
let imageView = UIImageView { $0
.contentMode(.scaleAspectFit)
.backgroundColor(.black)
.layer.scope { $0
.masksToBounds(true)
.cornerRadius(10)
}
}
override func loadView() {
self.view = imageView
}
}
注意: 这种方式也推荐使用,而且更 安全,因为它修改的是现有对象。
import FunctionalBuilder
class ImageViewController: UIViewController {
let imageView = UIImageView().builder
.contentMode(.scaleAspectFit)
.backgroundColor(.black)
.layer.masksToBounds(true)
.layer.cornerRadius(10)
.build()
override func loadView() {
self.view = imageView
}
}
声明
public class TapGestureRecognizer: UITapGestureRecognizer {
var onTapGesture: ((TapGestureRecognizer) -> Void)?
init() {
super.init(target: nil, action: nil)
commonInit()
}
override public init(target: Any?, action: Selector?) {
super.init(target: target, action: action)
commonInit()
}
private func commonInit() {
self.addTarget(self, action: #selector(handleTap))
}
@objc private func handleTap(_ recognizer: TapGestureRecognizer) {
onTapGesture?(recognizer)
}
}
用法
let tapRecognizer = TapGestureRecognizer()
// handler setup
tapRecognizer.onTapGesture = { recognizer in
// ...
}
// call from the outside
tapRecognizer.onTapGesture?(tapRecognizer)
声明
public class TapGestureRecognizer: UITapGestureRecognizer {
@Handler<TapGestureRecognizer>
var onTapGesture
init() {
super.init(target: nil, action: nil)
commonInit()
}
override public init(target: Any?, action: Selector?) {
super.init(target: target, action: action)
commonInit()
}
private func commonInit() {
self.addTarget(self, action: #selector(handleTap))
}
@objc private func handleTap(_ recognizer: TapGestureRecognizer) {
_onTapGesture(recognizer)
}
}
用法
let tapRecognizer = TapGestureRecognizer()
// handler setup now called as function
tapRecognizer.onTapGesture { recognizer in
// ...
}
// call from the outside now uses propertyWrapper projectedValue API, which is not as straitforward
// and it is nice, because:
// - handlers usually should not be called from the outside
// - you do not lose the ability to call it, but an API tells you that it's kinda private
tapRecognizer.$onTapGesture?(tapRecognizer)
您还可以使用 Configurator
创建这样的实例
let tapRecognizer = TapGestureRecognizer { $0
.$onTapGesture { recognizer in
// ...
}
}
通过将初始值传递给构建器来定制任何对象
let object = Builder(Object())
.property.subproperty(value)
.build() // Returns modified object
对于类,您可以通过调用 apply
方法而不是 build
来避免返回值
let _class = _Class()
Builder(_class)
.property.subproperty(value)
.apply() // Returns Void
在 Builders 和 Configurators 中,您都可以使用作用域
let object = Object { $0
.property.subproperty(value)
}
使您自己的类型符合 BuilderProvider
协议以访问 builder 属性。
import CoreLocation
import DeclarativeConfiguration
extension CLLocationCoordinate2D: BuilderProvider {}
// Now you can access `location.builder.latitude(0).build()`
注意: 你的 NSObject 类 必须 实现
init()
才能使用 Configurators。 这是为方便你的代码库所做的一点点权衡,请参见tests 中的示例。
OptionalDataSource
和 DataSource
类型与 Handler
非常相似,但如果 Handler<Input>
有点像 OptionalDataSource<Input, Void>
,则第二个可能具有不同的输出类型。 用法相似,提供不同的类型只是为了更好的语义。
您可以通过将 DeclarativeConfiguration 作为软件包依赖项添加到 Xcode 项目。
"https://github.com/makeupstudio/swift-declarative-configuration"
如果您使用 SwiftPM 进行项目结构,请将 DeclarativeConfiguration 添加到您的软件包文件中。
.package(
url: "git@github.com:capturecontext/swift-declarative-configuration.git",
.upToNextMinor(from: "0.3.0")
)
或者通过 HTTPS
.package(
url: "https://github.com:capturecontext/swift-declarative-configuration.git",
.exact("0.3.0")
)
不要忘记目标依赖项
.product(
name: "DeclarativeConfiguration",
package: "swift-declarative-configuration"
)
该库是在 MIT 许可下发布的。 有关详细信息,请参见LICENSE。