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

门克

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

    }
}

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

马丁·R

class funcstruct类型等效的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

这里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设置为从static属性返回的相同值。变化test2.ptr不会改变 test2,从而导致输出有些出乎意料test1.ptr.attribute

请参阅星期五问答,2015-04-17:让我们构建Swift.Array,获得有关如何解决此问题的有趣文章。


顺便说一句,它static也可以与类类型一起使用,这static是一种快捷方式class final:不能在子类中覆盖的类型方法。由于结构类型没有继承,因此将结构类型的类型方法编写为有意义static

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

创建新的通用结构的正确方法是什么?

创建异常层次结构的正确方法是什么?

在C中创建和初始化包含函数指针的结构的正确方法是什么?

在python中创建嵌套列表/字典的正确方法是什么,类似于类似json的结构?

从颜色创建画笔的正确方法是什么?

创建复杂元素的正确方法是什么?

从灯具返回结构化数据的正确方法是什么?

在结构中存储不变路径的正确方法是什么?

在Go中实现堆栈以存储结构的正确方法是什么?

部分初始化结构的正确方法是什么?

在结构中引用内存的正确方法是什么

使用指针和 offsetof() 访问结构的正确方法是什么

使用结构指针和C接口的“正确”方法是什么?

创建具有不同结构的向量的通常方法是什么?

正确的方法是什么?

React Components-创建它们的正确方法是什么?

在.NET(或常规)中创建文档的正确方法是什么?

创建系统可引导映像的正确方法是什么?

从FFI返回的片中创建OsStr(ing)的正确方法是什么?

使用autofac创建需要参数的对象的正确方法是什么?

为内联汇编创建常量池的正确方法是什么?

创建全局数组常量的正确方法是什么?

在Catalina中创建根符号链接的正确方法是什么

创建全局iron:router订阅的正确方法是什么?

在Java中创建对象数组的正确方法是什么?

在CosmosDB中创建表的正确方法是什么?

在Nativescript中创建组件的正确方法是什么?

创建被拒绝的JS承诺的正确方法是什么?

为 Vue 道具创建类型的正确方法是什么