@objc protocol Transaction { func commit() -> Bool optional func isComplete() -> Bool } 以上协议被标示为@objc属性,使得它兼容Objective-c代码.如果协议拥有可选的协议或属性的话这是必须的,因为Swift要使用Objective-C运行时去检查类所遵守的可选方法是否存在. 不幸的是,这意味着拥有可选方法的协议只能被类遵守;结构和枚举不可以遵守包括可选方法的协议. 协议一般并不包括可选方法或属性,…
可选类型也是Swift语言新添加的对象.主要是为了解决对象变量或常量为空的情况.在前面定义的变量和常量都不能为空.里面必须要有值. Swift中的可选类型则允许变量(常量)中没有值(被设为nil).要注意的是,Swift中的nil和OC中的nil不一样.前者的nil表示没有值,而后者的nil表示变量值为空. 可选类型需要在类型后面加一个问号(?).一个典型的例子是String类有一个toInt方法,该方法会将字符串转换为Int类型.不过这里就有一个问题,字符串中可能包含非数字的字符,这时救护转化…
干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> String { print("cm") return "abc" } } let insa = A() let insb = B() let insc = C() insa.p = insb //insa.p = nil insb.p = insc let r = in…
Swift中的反射非常有限,仅允许以只读方式访问元数据的类型子集.或许 Swift 因有严格的类型检验而不需要反射.编译时已知各种类型,便不再需要进行进一步检查或区分.然后大量的 Cocoa API 会立即给实例分配"AnyObject"类型,用户只能想方设法去做类型匹配. 而这里将回顾 Swift 中的反射.镜像类型以及将它们结合起来的 MirrorType 协议. MirrorType 反射的切入点为「reflect」函数,「reflect」函数可将任何类型作为其单参数并返回一个…
我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是不会给变量赋值初始值的,所以当你声明一个字符串变量的时候,var string:String   就会被系统报错,但是目前的swift版本却不报错了. 但是你要给一个字符串赋值未nil的时候,var string:String = nil 就一定是错误的   因为nil并不是一个字符串类型,而实际上…
什么时候用通知,什么时候用代理,什么时候用block 通知 : 两者关系层次太深,八竿子打不着的那种最适合用通知.因为层级结构深了,用代理要一层一层往下传递,代码结构就复杂了 代理 : 父子关系,监听的方法较多的时候使用 block : 父子关系,监听的方法较少的时候使用 Swift中的代理 swift中代理的实现 定义swift中代理的协议 // swift 中的代理必须继承自NSObjectProtocol protocol VisitorViewDelegate : NSObjectPro…
在我们进行 App 开发的时候,经常会用到的一个操作就是判断两个对象是否相等.比如两个字符串是否相等.而所谓的 相等 有着两层含义.一个是值相等,还有一个是引用相等.如果熟悉 Objective-C 开发的话,就会知道 Objective-C 为我们提供了一系列 isEqual: 方法来判断值相等,而 == 等于号用来判断引用相等. 我们来看一个 Objective-C 的例子就会更加明白了: NSArray *arr1 = @[@"cat",@"hat",@&qu…
Swift 中的协议协议是为方法.属性等定义一套规范,没有具体的实现,类似于Java中的抽象接口,它只是描述了方法或属性的骨架,而不是实现.方法和属性实现还需要通过定义类,函数和枚举完成. 协议定义 // 协议定义通过关键字protocol protocol SomeProtocol { // 协议定义 } // 协议可以继承一个或者多个协议 protocol SomeProtocol2 :SomeProtocol { // 协议定义 } // 结构体实现协议 struct SomeStruct…
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在Cocos2D编程for Swift中看到以下一个代码片段: protocol GameMode:class{ var userInterface:CCNode! {get} func gameplay(mainScene:MainScene,droppedFallingObject:FallingObject) func gameplay(mainSc…
Objective-C中的protocol里存在@optional关键字,被这个关键字修饰的方法并非必须要被实现.我们可以通过接口定义一系列方法,然后由实现接口的类选择性地实现其中几个方法.在Cocoa API中很多情况下接口方法都是可选的,这点和Swift中的protocol的所有方法都必须被实现这一特性完全不同.   那些如果没有实现则接口就无法正常工作的方法一般是必须的,而相对地像作为事件通知或者对非关键属性进行配置的方法一般都是可选的.最好的例子我想应该是UITableViewDataS…