gpt4 book ai didi

ios - Swift 2.0 一行中的单例

转载 作者:可可西里 更新时间:2023-11-01 00:52:17 24 4
gpt4 key购买 nike

请帮助我使用 Swift,我需要可以继承的单例。我可以这样做

class A {
var defaultPort: Int
required init() {
self.defaultPort = 404
}
class var defaultClient: A {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: A? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = self.init()
}
return Static.instance!
}
}

但是在swift 2.0中我们可以这样做

static let defaultClient = A() //self.init() 

但它以任何方式创建类 A 的实例。我如何使用这样的 self.init()

static let defaultClient = self.init()

为了能够继承

UPD目前最好的方法

class A {
class func defaultClient() -> Self {
struct Static {
static var onceToken: dispatch_once_t = 0
static var instance: A? = nil
}
dispatch_once(&Static.onceToken) {
Static.instance = self.init()
}
return instance(Static.instance, asType: self)
}
}

这里我们需要帮助

func instance<T>(instance: Any, asType type: T.Type) -> T {
let reurnValue = instance as! T
return reurnValue
}

因为目前还不存在将 A 转换为 Self 的另一种方法。

p.s. crazy swift way! why i can not do instance as! Self

最佳答案

你的问题不是很清楚。您正在寻找类似于 this answer 中发布的类常量解决方案之类的东西,但它会自动使用“我自己的类”,而不是显式创建特定类的实例……对吗?

也就是说,你想把这个:

class Singleton  {
static let sharedInstance = Singleton()
}

进入这个:

class Singleton  {
static let sharedInstance = SomeMagicThing()
}
class SingletonSubclass {}

当你调用 Singleton.sharedInstance 时,SomeMagicThing 会自动创建一个 Singleton 实例,而当你调用 SingletonSubclass 实例时你调用 SingletonSubclass.sharedInstance。正确吗?

抱歉,这无法完成(从 Swift 2.1 开始)。

部分问题是 staticclass 意味着两个不同的东西。 static 修饰符意味着它修改的声明仅与特定类型声明相关联。因此,Singleton 类型拥有一个指向特定对象的指针——它的子类不继承该指针。 (如果他们这样做了,它会指向同一个对象还是特定于子类的对象?)

如果您可以创建一个 class varclass let,那(理论上)会为您提供所需的调度/继承。但是尝试这样做会给你一个错误(强调我的):

class stored properties not yet supported in classes; did you mean static?

所以听起来这种事情总有一天会出现。

当然,问题的另一面是找到一种方法来动态引用负责执行某些语句的“当前”类型。在实例方法的上下文中,您可以使用 self.dynamicType 来处理这些事情……但是没有类的等价物。 (Self 是一种类型约束,而不是实际类型。)这是 Swift 中的类型系统的副作用,它比 Objective-C 的类型系统更加严格和静态(例如,元类型不是它只是普通物体的特殊 flavor )。 File a bug如果您想看到这种效果的变化?

关于ios - Swift 2.0 一行中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33445455/

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