如何在Swift中启动一个单例?

问题描述:

我有一个叫做HTTPHelper的类,它负责完成我所有的后端API请求。这个类中的所有方法都是class方法。正如您所知,实例属性不能从class方法中使用。我有一些特性需要用do{}catch{}块目前正从启动的init(){}内像这样的初始化:如何在Swift中启动一个单例?

class HTTPHelper{ 
    init(){ 
     do { 
      //initiate property 
     } catch{} 
    } 
} 

我的问题是,是否有类似的init(){}将发起一个静态属性的一种机制单身?

+0

我建议实行一个标准单(https://*.com/问题/ 26742138/singleton-in-swift/26743597#26743597),使您的属性成为单例的常规实例属性。 – Rob

+0

所以基本上发生了什么事情,你只是定义一个“定期”类而没有任何'class'方法或'static'属性,并且只需创建一个该类的静态实例? @罗布 –

+0

是的。像['URLSession.shared'](https://developer.apple.com/reference/foundation/urlsession/1409000-shared)或['FileManager.default'](https://developer.apple.com/reference/)基础/文件管理器/ 1409234-default).. – Rob

您可以为一个闭包或函数的结果指定一个属性(注意末尾的=()用于执行闭包 - 这与计算属性不同,其中每次重新创建值)。相反,第一次访问属性时,一旦使用函数/闭包,该值将被延迟计算,然后存储在属性中以供将来访问。

class MyClass { 
    static let myProperty: String = { 
     do { 
      return try blah() 
     } catch { 
      // error handling 
     } 
    }() 
} 

当然,这是分配函数的结果为属性的一种特殊情况:

class MyClass { 
    static let myProperty: String = MyClass.createMyString() 

    static func createMyString() -> String { 
     do { 
      return try blah() 
     } catch { 
      // error handling 
     } 
    } 
} 
+1

_“这不同于每次重新创建值的计算属性” - 实际上;它更像是一个**懒惰的**属性。 –

+1

谢谢杰克为你解答。如果你还可以在你的文章中加入Rob的评论,以便将来的读者可以获得更完整的答案,我会非常感激。 –