在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> 允许一个对象返回一个字符串来描述它的内容
文/大石头布(简书作者)
原文链接:http://www.jianshu.com/p/042fa8348c14
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

Swift补基础之Selector、条件编译、编译标记、NSObject的更多相关文章

  1. Swift之基础知识

    Swift之基础知识 出于对Swift3.0的学习,写下这篇基本语法的笔记.希望能帮助记忆 -0- 这边提供Swift3.0中文教材,资源链接: https://pan.baidu.com/s/1c2 ...

  2. Swift语法基础入门三(函数, 闭包)

    Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...

  3. Swift语法基础入门一(适合有C, OC开发人员)

    Swift开发体验 /*: 创建对象 * OC: alloc initWithXXX 方法 * Swift: (xxx:) */ /*: 调用方法 * OC: [UIColor redColor]; ...

  4. Swift语法基础入门四(构造函数, 懒加载)

    Swift语法基础入门四(构造函数, 懒加载) 存储属性 具备存储功能, 和OC中普通属性一样 // Swfit要求我们在创建对象时必须给所有的属性初始化 // 如果没办法保证在构造方法中初始化属性, ...

  5. [Swift]基础

    [Swift]基础 一, 常用变量 var str = "Hello, playground" //变量 let str1="Hello xmj112288" ...

  6. 从头开始学c++,补基础,补踏实

    在对c++一知半解的情况下,写c++程序是非常吃力的.对于半路出家写c++的我,写了几个颓废的程序后,再也没有勇气用现有的c++知识去写千疮百孔的程序.非常想写出<整洁的代码>中那样的代码 ...

  7. -DDEBUG编译标记

    想必大家都有利用输出函数如printf来帮助我们调试程序的经历,这是一种比较原始的程序调试辅助方法,在Linux下也可以为我们所用.不过这种方法有一个明显的缺点,就是在调试完后我们必须注释或删除掉这些 ...

  8. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

  9. swift编程语言基础教程 中文版

    swift编程语言基础教程 中文版 http://download.csdn.net/detail/u014036026/7845491

随机推荐

  1. eclipse - copy类的全名

    由于多次操作,感觉eclipse应该提供这个功能,网上搜一下,发现需要安装插件. 下载地址为 http://www.jave.de/eclipse/copyfully/copyfully_1.2.0. ...

  2. oracle 复制一条记录只改变主键不写全部列名

    场景:表TEST中有C1,C2,C3...字段,其中C1为主键,先需要复制表TEST中一条(C1='1'的)记录,修改主键列C1和需要变更的列后,再插入到表TEST中. procedure P_TES ...

  3. JavaScript 函数作用域和闭包

    函数作用域和闭包  词法作用域   它们在定义它们的作用域里运行,而不是在执行的作用域运行,但是只有在运行时,作用域链中的属性才被 定义(调用对象),此时,可访问任何当前的绑定.   调用对象     ...

  4. 关于List、Set集合以及Map的使用

    package tingjizifu; import java.util.*; public class TongJi { /* * 使用Scanner从控制台读取一个字符串,统计字符串中每个字符出现 ...

  5. Python3学习之一环境搭建

    Windows 7 Python343下载 PTVS下载 Linux CentOS7 wget https://www.python.org/ftp/python/3.4.3/Python-3.4.3 ...

  6. html表格table设置边框

    对于很多初学HTML的人来说,表格<table>是最常用的标签了,但对于表格边框的控制,很多初学者却不甚其解. 一般我们用表格的时候总会给它个border属性,比如:<table b ...

  7. 数据分页SQL语句的比较

    建立表 CREATE TABLE [TestTable] ( , ) NOT NULL , ) COLLATE Chinese_PRC_CI_AS NULL , ) COLLATE Chinese_P ...

  8. 简单讲解iOS应用开发中的MD5加密的相关使用

      简单讲解iOS应用开发中的MD5加密的相关使用   作者:文顶顶 字体:[增加 减小] 类型:转载 时间:2015-12-19 我要评论 这篇文章主要介绍了iOS应用开发中的MD5加密的相关使用, ...

  9. Jackknife,Bootstraping, bagging, boosting, AdaBoosting, Rand forest 和 gradient boosting的区别

    引自http://blog.csdn.net/xianlingmao/article/details/7712217 Jackknife,Bootstraping, bagging, boosting ...

  10. MFC动态创建按钮,并在按钮上实现位图的切换显示

    动态创建按钮,并在按钮中添加位图,通过单击按钮显示不同的位图,可设置为显示按钮按下和弹起两种状态.只要判断a值从而输入不同的响应代码. 1.在头文件中添加: CButton *pBtn; 2.在初始化 ...