在Swift类中,我们可以使用class function
创建预设实例。像下面的日历示例:
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
struct类型等效的是static func
:
static func testStruct() -> SomeStruct {
return SomeStruct(value: "foo")
}
静态属性(“单例模式”)与类和结构类型完全相同:
static let singleStruct = SomeStruct(value: "foo")
testStruct()
在每个调用上创建一个值,而singleStruct
一次创建(在第一个调用上)一次。
在大多数情况下,这没有什么区别,因为结构是值类型。如果创建的值是“昂贵的”,则静态属性具有优势。另外,正如@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
这里test1
和test2
是单独的值,我们得到了预期的输出。
使用静态属性:
let test1 = SomeStruct.singleStruct
print(test1.ptr.attribute) // foo
let test2 = SomeStruct.singleStruct
test2.ptr.attribute = "bar"
print(test1.ptr.attribute) // bar <--- What?
在这里,test1
和test2
设置为从static属性返回的相同值。变化test2.ptr
不会改变 test2
,从而导致输出有些出乎意料test1.ptr.attribute
请参阅星期五问答,2015-04-17:让我们构建Swift.Array,获得有关如何解决此问题的有趣文章。
顺便说一句,它static
也可以与类类型一起使用,这static
是一种快捷方式class final
:不能在子类中覆盖的类型方法。由于结构类型没有继承,因此将结构类型的类型方法编写为有意义static
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句