Swift 如何强制实例设置其所有属性?
假设我有一个结构或类,如下所示:Swift 如何强制实例设置其所有属性?,swift,Swift,假设我有一个结构或类,如下所示: struct Person { var firstName: String var lastName: String } 当我创建这个人的实例时,我必须设置所有属性的值 我需要一个结构,它有很多属性,需要设置所有。我不应该错过任何价值。稍后,我的计划是将所有属性作为键值对获取,我将使用Mirrorreflecting:self-on-Person结构实现这一点 protocol ProtocolPerson { va
struct Person {
var firstName: String
var lastName: String
}
当我创建这个人的实例时,我必须设置所有属性的值
我需要一个结构,它有很多属性,需要设置所有。我不应该错过任何价值。稍后,我的计划是将所有属性作为键值对获取,我将使用Mirrorreflecting:self-on-Person结构实现这一点
protocol ProtocolPerson {
var firstName: String? {get set}
var lastName: String? {get set}
}
我用协议尝试的解决方案
protocol ProtocolPerson {
var firstName: String {get set}
var lastName: String {get set}
}
func someFunction() {
let tempFirstName = "John"
struct Person: ProtocolPerson {
var firstName: String = tempFirstName
var lastName: String = ""
}
}
在这里,我可以强制Person结构拥有所有属性,但我可以传递外部值来设置其值。有其他解决方案吗?尝试为给定结构创建构造函数
struct Person {
var firstName: String
var lastName: String
init(firstName: String, lastName: String) {
self.firstName = firstName
self.lastName = lastName
}
}
let person = Person() // error
我不知道它是否适合您想要的项,但是对于具有大量属性的类,我更喜欢使用Builder 逐步: 步骤1:为其他结构和类创建生成协议实现以下操作:
public protocol Build {
associatedtype T = Self where T:Build
/// buildWith: by call buildWith, you can set any properties.
/**
struct Sample: Build {
var name: String = ""
init() {}
}
let object = Sample().buildWith.name("Hessam").build()
*/
var buildWith: QueryBuilder<T> { get set }
init()
}
extension Build {
public var buildWith: QueryBuilder<Self> {
get {
QueryBuilder(self)
}
set { }
}
}
第4步:最后一项工作是实现构建协议并添加构造函数,无需任何参数:
struct Person: ProtocolPerson, Build {
var firstName: String?
var lastName: String?
var phoneNumber: String?
// add init. Build protocol needed this
init() {}
}
最后一步:对于使用生成器从Person创建对象:
let person = Person()
.buildWith
.firstName("John")
.lastName("apple")
.build()
使用此方法,您可以给出要构建时间的每个变量的值,而其他变量有自己的初始值或nil
输出:
为什么不使用类?@Titouan同样的错误,类声明不能关闭外部作用域中定义的值“value”。在这里,我可以强制Person结构拥有所有属性,但我可以传递外部值来设置其值。我不确定这是什么意思。你能用一些代码解释一下吗?你说的那个错误是什么?你在问题中没有提到它。@Titouan和sweeper,请看问题中更新的代码。我的结构大约有20个属性,这就是为什么要寻找不同的解决方案。
let person = Person()
.buildWith
.firstName("John")
.lastName("apple")
.build()