【问题标题】:Swift - create custom class of type `Array`Swift - 创建类型为“Array”的自定义类
【发布时间】:2015-01-14 11:46:52
【问题描述】:

如何在 swift 中创建 Array 类型的自定义类? 确切地说,我有一个Car 类型的自定义类,现在我想创建一个由Cars 组成的数组的单例。 (因为我希望能够从我的应用程序中的任何位置访问它)。

我的解决方法是将我的单例定义为NSMutableArray。但我看到这会导致我的代码出现一些问题。所以我希望将它定义为 swift 数组。 我该怎么做?

我现在的代码是:

class MyCars: NSMutableArray {
    class var sharedInstance: MyCars {
        struct Static {
            static var instance: MyCars?
            static var token: dispatch_once_t = 0
        }

        dispatch_once(&Static.token) {
            Static.instance = MyCars()
        }

        return Static.instance!
    }
}

【问题讨论】:

  • Swift数组实现为struct,不支持继承——所以不可能
  • 那么我所做的是最好的方法吗?还有其他方法可以获得我想要的功能吗?
  • 为什么需要继承?想要添加新方法或覆盖现有方法?
  • 没有。我只想拥有一个单身人士,这是我的Cars 的Array。但我认为NSMutableArray 做得并不完美..
  • @roi.holtzman 你最后用了什么?我有同样的心态,在我的情况下,我有一个自定义类访问者,我喜欢数组 listVisitors。我也碰到过单身人士,但不确定这是否是要走的路。就我而言,我喜欢从列表中添加/删除访问者。您介意分享您的实际解决方案吗??

标签: arrays swift singleton


【解决方案1】:

要创建 Car 的单例数组,您无需创建新类 - 只需一个带有静态成员的结构:

struct MyCars {
    static var sharedInstance = Array<Car>()
}

请注意,sharedInstance 已初始化一次 - 请阅读 this answer 了解更多信息

附录

如果您想使用MyCars 来引用Car 的数组,您可以定义一个类型别名并为包含单例的结构使用不同的名称,例如:

typealias MyCars = Array<Car>

struct Singleton {
    static var myCars = MyCars()
}

【讨论】:

  • 我收到一个错误:NSArray is not subtype of MyCars。你知道怎么解决吗?
  • 我现在的代码是:class MyCars { class var sharedInstance : MyCars { struct Singleton { static var instance = Array&lt;Car&gt;() } return Singleton.instance } }
  • 如果您需要该课程来做其他事情,那么它看起来不错。如果它只是静态属性的容器,那么我认为结构更好 - 更少的代码:)
  • 但我有结构。我想我应该这样写,所以我会有一个单身人士。你不知道我为什么会出现我提到的错误?
  • 抱歉没有看到您的第一条评论。你是怎么得到这个错误的?请记住,您必须以 MyCars.sharedInstance 的身份访问单例
【解决方案2】:

据我了解,单例代表一个类或结构,永远只能有一个实例。即使有人试图实例化一个新的单例副本,他们最终也会得到一个指向唯一实例的指针。 (我从 Big Nerd Ranch Guide to iOS Programming 中得到了这个想法,但它似乎没有争议)。我不认为上面提出的结构解决方案符合这个标准。例如,在操场上创建建议的结构(我已将 'String' 类型替换为 'Car' 类型以使测试更容易):

struct MyCars {
    static var sharedInstance = Array<String>()
}

然后初始化结构并显示初始化“接受”:

MyCars.sharedInstance = ["Granada", "Pinto", "Chevette"]
println( MyCars.sharedInstance )
// prints all three car names

现在尝试创建数据的副本并显示它有效,然后修改副本:

var myCars = MyCars.sharedInstance
println( myCars )
// the above prints all three cars
myCars.append("Gremlin")

这两个变量是否指向不同的集合?测试:

println( MyCars.sharedInstance )
// the above prints three cars
println( myCars )
// the above prints four cars 

因此,在 Playground 环境中,您不会使用带有静态变量的结构来获得单例。这是不幸的,否则它将是实现单例数组的一种非常简单的方法。我在这个问题上遇到了很大的困难。这个post 中已经阐明了部分解决方案。在此解决方案中,您确实可以使用下标引用单例(因此单例有点类似于数组)。但是缺少其他数组功能(例如正常分配)。也就是说,您不能使用以下内容:

MySingletonClass.sharedInstance = [ "Granada", "Pinto", "Chevette" ]

注意:我对 Swift 很陌生;上述断言没有多大权威。从 Swift 1.1 到 Swift 1.2,单例的定义方式发生了变化,这些变化总结在 here。 Swift 1.1 用于定义单例的机制令人困惑,但 Martin Rue 有一个非常易读的逐步开发说明here

祝你好运! - 乔治

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多