我有一个Swift框架,定义了一个结构体:
public struct CollectionTO {
var index: Order
var title: String
var description: String
}
但是,我似乎不能从导入库的另一个项目中使用隐式的按成员初始化器。错误是:
'CollectionTO'不能被初始化,因为它没有可访问的初始化器
也就是说,默认的合成成员初始化器不是公共的。
var collection1 = CollectionTO(index: 1, title: "New Releases", description: "All the new releases")
我必须像这样添加我自己的init方法:
public struct CollectionTO {
var index: Order
var title: String
var description: String
public init(index: Order, title: String, description: String) {
self.index = index;
self.title = title;
self.description = description;
}
}
... 但是有没有一种方法可以做到这一点而不显式地定义一个公共init?
有时候,当你不需要初始化式时,使用它真的很烦人。如果不断地更新对象的变量,那么在3个地方(变量声明、初始化式参数和初始化式实现)更新变量就会变得非常麻烦。
对于这个问题,我使用的一个变通方法是在结构上使用一个静态变量来充当(或本质上包装)“初始化器”。例如:
struct MyStruct {
static var empty = Self()
static func empty(name: String) -> Self {
.init(privateName: name)
}
private var identifier: String = ""
}
然后你可以像调用初始化器一样调用它(带有自动完成和所有的东西!):
func someFunction(_ value: MyStruct) { ... }
//someFunction(.init()) -> ERROR, invalid due to `private` variable
someFunction(.empty)
someFunction(.empty(name: "Dan IRL"))
let myObject = MyStruct.empty
let myObject2 = MyStruct.empty(name: "Monty Python")
有时候,当你不需要初始化式时,使用它真的很烦人。如果不断地更新对象的变量,那么在3个地方(变量声明、初始化式参数和初始化式实现)更新变量就会变得非常麻烦。
对于这个问题,我使用的一个变通方法是在结构上使用一个静态变量来充当(或本质上包装)“初始化器”。例如:
struct MyStruct {
static var empty = Self()
static func empty(name: String) -> Self {
.init(privateName: name)
}
private var identifier: String = ""
}
然后你可以像调用初始化器一样调用它(带有自动完成和所有的东西!):
func someFunction(_ value: MyStruct) { ... }
//someFunction(.init()) -> ERROR, invalid due to `private` variable
someFunction(.empty)
someFunction(.empty(name: "Dan IRL"))
let myObject = MyStruct.empty
let myObject2 = MyStruct.empty(name: "Monty Python")