Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何强制实例设置其所有属性?_Swift - Fatal编程技术网

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()