在swift中使用条件编译比较直接
#if <condition>
#elseif <condition>
#else
#endif
例如 :在debug模式和release模式编译不同代码
#if DEBUG
#else
#endif
在swift中判断iOS版本是否可用 更简单啦
//#available(iOS 8, *)
//数字随便改啦
if #available(iOS 9.0, *) {
//如果是9.0 或者以上
}else{
}
编辑标记
在swift中支持几种编译标记
//FIXME: 请修正此方法
private func x1() {
print("x1")
}
//MARK: -这个是正确的
@objc private func x2() {
print("x2")
}
//TODO: - 以后要做的先标记
func todoMethod(){
}
加了这种标记后 找起来就方便多了
Selector
Selector可以将一个方法转换并赋值给一个 SEL
类型,它的表现很类似一个动态的函数指针。在 objc 时 selector 非常常用,从设定 target-action,到自举询问是否响应某个方法,再到指定接受通知时需要调用的方法等等,都是由 selector 来负责的。
下面看看Selector基本用法
func x(){
print("x")
}
func y(n:NSNumber){ //(一个小坑)这里不能用基础类型 int float之类的 不是AnyObject
print("y = \(n)")
}
//MARK: - 测试z方法
func z(n:NSNumber,m:NSNumber){
print("z = \(n) , \(m)")
}
//FIXME: 请修正此方法
private func x1() {
print("x1")
}
//MARK: -这个是正确的
@objc private func x2() {
print("x2")
}
这里搞了几个方法,看看怎么用
let sel = NSSelectorFromString("x")
let meth1 = Selector("x")
let meth2 = Selector("y:") //一个参数
let meth3 = Selector("z:m:") //多个参数
// selector 其实是 objc runtime 的概念,如果这个你的 selector 对应的方法只在 Swift 中可见的话 (也就是说它是一个 Swift 中的 private 方法),在调用这个 selector 时你会遇到一个 unrecognized selector 错误:
//所以要在private方法前面加@objc
let meth4 = Selector("x2")
两种方式 都是可以的
你有很多种调用的方式 看需求了
self.performSelector(meth1)
self.performSelector(meth2,withObject: 2)
self.performSelector(meth3,withObject: 2,withObject: 12)
self.performSelector(meth4)
NSThread.detachNewThreadSelector(meth2, toTarget: self, withObject: 3333)
if self.respondsToSelector(sel){
self.performSelector(sel)
}
self.performSelector(meth2, withObject: 24, afterDelay: 2)//延时执行
NSObject
在swift中大多数类都继承自NSObject 看下有哪些基础操作
下面的测试都是在ViewController的viewDidLoad方法中测试的,可以直接无痛看注释
print(self.isKindOfClass(NSObject)) //true 测试一个接收器是否是一个指定类的实例
print(self.isMemberOfClass(NSObject)) //false 从属关系
print(self.isMemberOfClass(ViewController)) // true
print(self.respondsToSelector(sel)) //true 是否实现了一个指定的方法
print(self.conformsToProtocol(UITableViewDelegate)) //false 是否实现了某个协议
print(self.isEqual(ViewController())) //false 对象比较
print(self.description) //<DynimicTest.ViewController: 0x7fac48c377b0> 允许一个对象返回一个字符串来描述它的内容