参见英文答案 > Whither dispatch_once in Swift 3?6
> Using a dispatch_once singleton model in Swift25个
迁移到Swift 3时,dispatch_once_t有问题.

根据Apple’s migration guide:

The free function dispatch_once is no longer available in Swift. In
Swift,you can use lazily initialized globals or static properties and
get the same thread-safety and called-once guarantees as dispatch_once
provided. Example:

let myGlobal = { … global contains initialization in a call to a closure … }()

_ = myGlobal // using myGlobal will invoke the initialization code only the first time it is used.

所以我想迁移这个代码.所以在迁移之前:

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

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

    return Static.instance!
}

迁移后,按照Apple的指南(手动迁移),代码如下所示:

class var sharedInstance: CarsConfigurator
{
    struct Static {
        static var instance: CarsConfigurator?
        static var token = {0}()
    }

    _ = Static.token

    return Static.instance!
}

但是当我运行这个访问返回时,我得到以下错误Static.instance !:

Fatal error: unexpectedly found nil while unwrapping an Optional value

我从这个错误中看到,实例成员为零,但为什么呢?我的迁移有问题吗?

即使Swift 2中有效,该代码过于冗长.在Swift 3中,Apple强制您通过关闭来使用延迟初始化:
class CarsConfigurator {
    static let sharedInstance: CarsConfigurator = { CarsConfigurator() }()
}

“dispatch_once_t”在Swift中不可用:使用懒惰初始化的全局变量的更多相关文章

  1. 适用于iOS的Google Maps SDK不断增加内存使用量

    我已经构建了一个在地图上显示标记的简单应用程序,我从服务器的JSON文件加载其x,y,标记是可点击的,所以一旦你在任何标记上它将你带到另一个UIViewController(我们将它命名为BViewController).我已经监视了内存使用情况,所以每次我从BViewController返回到MapViewController(里面的地图)时,它只是内存使用量的两倍我尝试将其设置为nill或从s

  2. ios – 定义全局颜色

    解决方法您应该创建一个类别,而不是子类.这将扩展UIColor类,并为其添加颜色..H.M通过这种方式定义颜色和#importing类别,您可以按照自己的方式应用此自定义颜色.

  3. Swift学习之每日一tip (6) 单例

    OC下的单例实现OC下的单例大家都写的滚瓜烂熟了,那么今天我就带大家先以仿照OC的方式写一段Swift下的单例实现Swift下的单例1.仿照OC版本怎么样?那小汤我建议你可以把代码忘掉,按照你的想法写一遍Swift版的单例,你就会发现它暗含的一些小坑啦~下面,小汤我给大家带来在Swift下特别的单例实现方案~小汤我表示大爱哦~哇嘎嘎!

  4. swift中单例实现

    }但是,其实swift中,单例实现上不必那么麻烦了写法二:privatestaticlettool=NetworkTool()classfuncsharednetworkTool()->NetworkTool{returntool}就是这么简单,因为在swift中,let本身就是线程安全的,所以可以直接用!而且,这样的加载方式也是懒加载,是在第一次使用的时候创建的。

  5. Swift入坑--单例

  6. Swift:实例方法和类型方法

    大家对“实例方法和类型方法”的概念应该不陌生了,在objective-c中很常见。例如:1.实例方法调用的时候,必须先进行实例化一个对象,然后调用init方法。而在Swift中写法有所改变,它使用class和static关键字来标示。

  7. Swift 1.2 实现单例

    Swift1.2单例实现第一种:类常量第二种:嵌套结构体第三种:GCD:dispatch_once参考:http://stackoverflow.com/questions/24024549/dispatch-once-singleton-model-in-swift

  8. Swift多种实现单例写法

    学习Swift的单例写法,以下提供了5种方式,一起来看看吧!

  9. swift单例和oc单例

    //GCD中的一次性代码//在写单例的时候,经常使用.//最简单的实现单例设计模式的方法.//====================OC版单例=====================/***快速创建工具类*/+(instancetype)share{staticidinstance;staticdispatch_once_toncetoken;dispatch_once(

  10. Swift中单例的集中创建方式

    单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象。下面看看swift中创建单例的集中方式:1、一个句话搞定,所有用到的地方都是同一个2、3、4.swift还在初学阶段,如果有不对的地方,还望指出。

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部