gpt4 book ai didi

swift - 创建预设结构的正确方法是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 07:29:24 25 4
gpt4 key购买 nike

在 Swift 类中,我们可以使用 类函数 来创建预设实例。就像下面的日历示例:

let calender = NSCalendar.currentCalendar()

这将具有与此类似的模式:

class SomeClass {

var attribute : String

init(value:String) {
attribute = value
}

class func testClass() -> SomeClass {
return SomeClass(value: "test")
}
}

let test = SomeClass.testClass()

但是结构中显然没有类函数。 Xcode 建议改用 static。这非常接近单例模式。

struct SomeStruct {

var attribute : String

init(value:String) {
attribute = value
}
static var testStruct = SomeStruct(value: "test")
}

单例模式

class Singleton {

static let shared = Singleton()

private init() {

}
}

因此,这是一种使用预设值初始化结构的好方法,因为结构是值类型。如果不行,正确的做法是什么?

最佳答案

结构类型的 class func 等价于 static func:

static func testStruct() -> SomeStruct {
return SomeStruct(value: "foo")
}

和静态属性(“单例模式”)的工作方式相同同时具有类和结构类型:

static let singleStruct = SomeStruct(value: "foo")

testStruct() 在每次调用时创建一个值,而 singleStruct创建值一次(在第一次调用时)。

在大多数情况下,这没有什么区别,因为结构是值类型。如果创建值(value)是“昂贵的”。另外,正如@Lance 在评论中注意到的那样,Apple 经常使用此模式,例如 CGRect.zero

但是,如果结构具有以下属性,则情况会有所不同是引用类型(或指向非托管内存的指针)。这是一个例子:

class MyClass {
var attribute : String
init(value : String) {
attribute = value
}
}

struct SomeStruct {

var ptr : MyClass

init(value : String) {
ptr = MyClass(value: value)
}
static func testStruct() -> SomeStruct {
return SomeStruct(value: "foo")
}

static let singleStruct = SomeStruct(value: "foo")
}

使用静态函数:

let test1 = SomeStruct.testStruct()
print(test1.ptr.attribute) // foo

let test2 = SomeStruct.testStruct()
test2.ptr.attribute = "bar"

print(test1.ptr.attribute) // foo

这里 test1test2 是单独的值,我们得到了预期的输出。

使用静态属性:

let test1 = SomeStruct.singleStruct
print(test1.ptr.attribute) // foo

let test2 = SomeStruct.singleStruct
test2.ptr.attribute = "bar"

print(test1.ptr.attribute) // bar <--- What?

这里,test1test2 被设置为从返回的相同值静态属性。更改 test2.ptr 不会改变 test2,导致 test1.ptr.attribute

的输出有点意外

参见 Friday Q&A 2015-04-17: Let's Build Swift.Array有关如何解决此问题的有趣文章。


顺便说一句,static 也可以与类类型一起使用,这里是 staticclass final 的快捷方式:一个不能被覆盖的类型方法在一个子类中。由于它使结构类型没有继承感觉结构类型的类型方法被写成static

关于swift - 创建预设结构的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33637891/

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