gpt4 book ai didi

swift - Swift 中的一步对象创建和属性初始化?

转载 作者:IT王子 更新时间:2023-10-29 05:39:55 25 4
gpt4 key购买 nike

有没有办法将属性值分配给类实例,即使它不是 init 构造函数中的参数?例如,在 C# 中我可以这样做:

public class Student
{
public string firstName;
public string lastName;
}

var student1 = new Student();
var student2 = new Student { firstName = "John", lastName = "Doe" };

student2 注意事项 即使类中没有构造函数,我仍然可以在初始化期间赋值。

我在 documentation 中找不到如果你能为 Swift 做这样的事情。如果没有,有没有办法使用extensions扩展Student类,在初始化时给属性赋值?

我正在寻找这个的原因是我可以将一堆实例添加到数组中而无需为每个学生实例显式创建变量,如下所示:

var list = new[] {
new Student { firstName = "John", lastName = "Doe" },
new Student { firstName = "Jane", lastName = "Jones" },
new Student { firstName = "Jason", lastName = "Smith" }
}

有什么 native 或优雅的方法可以在 Swift 中实现这一点?

最佳答案

您有几个选项,具体取决于您希望如何配置此类型以及哪种语法对您最方便。

您可以定义一个方便的初始化程序,它接受您要设置的属性。如果您始终设置相同的属性,则很有用;如果您设置的可选属性集不一致,则用处不大。

public class Student
{
public var firstName:String?;
public var lastName:String?;
}

extension Student {
convenience init(firstName: String, lastName: String) {
self.init()
self.firstName = firstName
self.lastName = lastName
}
}

Student(firstName: "Any", lastName: "Body")

您可以定义一个方便的初始化器,它接受一个 block 来配置新实例。

extension Student {
convenience init(_ configure: (Student) -> Void ) {
self.init()
configure(self)
}
}

Student( { $0.firstName = "Any"; $0.lastName = "Body" } )

你可以模仿 Ruby 的 tap方法作为扩展,因此您可以对方法链中间的对象进行操作。

extension Student {
func tap(block: (Student) -> Void) -> Self {
block(self)
return self
}
}

Student().tap({ $0.firstName = "Any"; $0.lastName = "body"})

如果最后一个有用,您可能希望能够在任何对象上采用 tap。我不认为您可以自动执行此操作,但您可以定义一个默认实现以使其更容易:

protocol Tap: AnyObject {}

extension Tap {
func tap(block: (Self) -> Void) -> Self {
block(self)
return self
}
}

extension Student: Tap {}

Student().tap({ $0.firstName = "Any"; $0.lastName = "body"})

关于swift - Swift 中的一步对象创建和属性初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34956711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com