您的位置:首页 > 移动开发 > Swift

分别使用OC和Swift语法创建单例

2016-08-04 09:08 405 查看
一、 OC中创建单例

  
/**

   
应用场景:网络工具,音频工具(切换界面时,背景音乐继续放,不会重新播放,不会暂停)

 */

@interface
Singleton :
NSObject

//提供的静态实例的创建方法。(全局访问点)

+(instancetype)sharedSinglenton;

-----------------------------------------------

//
OC的单例,每次调用的是一个全局使用的类函数

+(instancetype)sharedSinglenton{

   

   
//定义一个私有静态变量

   
static
id singlenton;

   

   
//是一个长整形,如果为0,就执行block中的代码!

   
static
dispatch_once_t onceToken;

    //dispatch_once_t是GCD提供的结构体,使用时需要将GCD地址传递给下面的dispatch_once函数,dispatch_once函数能够记录该代码块是否被调用。

   

   
dispatch_once(&onceToken,^{

        singlenton = [[self
alloc]init]; 
//self:本类

    });

   

    //dispatch_once是由GCD提供,作用是在整个应用程序的声明周期中只执行一次这个代码块。

   

   
return singlenton;

}

二、 Swift中创建单例

// 1.仿
OC
的写法!(仅供参考)
   
// 在
Swift

中不允许在函数中定义静态成员变量(保存在静态区的,有独立的存储空间)
   

   
static
var instance: SoundTools?   
//没有初始化会报错,所以设置成可选项。

    

//长整形,0时执行下边的代码块。
   
static
var onceToken:
dispatch_once_t =
0

   

   
// 1.
提供全局的访问点(类函数)
返回值类型
   
class
func sharedTools() ->
SoundTools
{
       
print(“你好,我要创建声音对象")
       
//dispatch_once(predicate: UnsafeMutablePointer<dispatch_once_t>, block: dispatch_block_t)
       
//UnsafeMutable:不安全的变量,所以是var,
let是常量安全的,
       
//Pointer:指针,传递变量的时候使用&,表示变量的地址, 
       
//<dispatch_once_t>变量的类型
       
//block: dispatch_block_t,

闭包,执行block时会将dispatch_once_t 

的值修改为非0
   

       
dispatch_once(&onceToken) { () ->
Void
in

           
//实例化
            instance =
SoundTools()

        }

       

       
return instance!     
//因为定义的instance是可选的,而我们返回时是必选的,所以需要强行解包。

    }

----------------------------------------------------

//2.swift[b]特有的写法(利用静态区和常量的特点[/b])
   
//
静态区的对象只能设置一次数值(设完一次值之后,就不会再赋值了,不能改了)
   
// Swift
中的的单例写法和懒加载几乎一样
`static let`
   
//
同样也是在第一次使用时,才会创建对象
   
[b]//swift[b]写法单例调用的是一个放在静态区的常量[/b][/b]
   

   
//static let sharedTools2 = SoundTools()
   
static
let sharedTools2:
SoundTools = {

      

       
print("创建声音对象")

       

       
return
SoundTools() 
//创建并返回一个ShareSingleton的对象

    }()

-----------------------------------------------------

//和上面是一样的
   
static
let sharedTools3 =
SoundTools()   
//第一次调用时通过(),调用下面的构造函数
   

   
//override
重写 

构造函数

b031
   
override
init() {

       
print("创建")

       

       
super.init()   
//让父类给变量赋初值

    }

三、Swift和OC混编

1.桥接那个文件(swift调OC)

//

目的:让
Swift
能够调用
OC
//

使用:让所有
Swift
需要访问的
OC
的头文件在此处引入

#import
"NetworkTools.h"

2. OC调swift

在OC文件中导入:
#import
"单例演练-Swift.h"

// ProductName-Swift.h

注意 ProductName

不能包含中文和数字的组合`-`
//
注意:Swift

调用 OC

不会有问题

//
但是
OC
无法访问
Swift
中的特殊语法,例如:枚举!

可以修改项目名称

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS开发 swift 单例 OC