Swift
外部参数名总结:
假设有以下代码
func sum(num1: Int, num2: Int) -> Int
{
return num1 + num2
}
-
函数
- 默认情况下,所有参数仅仅是局部参数名,不是外部参数名
sum(1, 2)
-
方法
- 默认情况下,第一个参数仅仅是除第一个参数以外,其他所有参数,既是局部参数名,又是外部参数名
var me = Person() me.sum(1, num2: 2)
-
构造方法
- 默认情况下,所有参数既是局部参数名,又是外部参数名
var me = Person(num1: 1, num2: 2)
!和?的区别
从IB中拖线的控件对应的变量:
// 系统自带
@IBOutlet weak var display: UILabel!
// 如果这样
@IBOutlet weak var display: UILabel?
?表示display是一个可选类型(option),!表示对可选类型进行强制解包,如果解包的变量是nil,程序就会崩溃.
系统自带的相当于在xib解档赋值的时候,进行了强制解包;而后面修改后,赋值时没有进行强制解包,所以后面使用display时,需要这样使用以获取其属性-->display!.text
枚举
swift的枚举可以关联任何类型,包括函数
函数在swift里面也是一个类型,和字符串没什么区别
在swift,所有的运算符,*等都是函数
尽量使内部成员private,在以后想访问时再进行打开操作
数组和字典在swift中是结构体(Int、Double等也是),所以传值的时候,是进行的值传递;除类是引用传递以外,其他类型都是值传递
Optional就是一个enum
enum Optional<T> {
case None
case Some(T)
}
let x: String? = nil 等价
let x = Optional<String>.None
let x: String? = "hello" 等价
let x = Optional<String>.Some("hello")
var y = x! 等价
switch x {
case Some(let value): y = value
case None: 抛出异常
}
...和..<是Range结构体的特殊实现:
struct Range<T> {
var startIndex: T
var endIndex: T
}
关于桥接
Swift中,String、Array、Dictionary是结构体(struct),不是对象(classes),但是他们还是可以称为AnyObject类型。这是因为他们桥接的NS对应类型是对象(NSString、NSArray、NSDictionary)
构造器的自动继承
1、 子类没有定义任何指定构造器
,它将自动继承所有父类的指定构造器
2、如果子类提供了所有
父类指定构造器
的实现--不管是通过规则1继承过来的,还是通过自定义实现的,它将自动继承所有
父类的便利构造器
模型相关
模型
使用struct
进行定义
如果想在控制器中扩展模型的属性,直接在控制器中使用extension
扩展模型属性就行了,因为只增加了自己想要使用的属性,模型中原来的属性并没有变化,所以并没有不合适的地方
判断当前控制器view有没有显示在界面上
if view.window == nil {
// 没有显示在当前界面上
}
关于unwind(在storyboard中点击对应控件进行返回)
有控制器V1->V2->V3
需要点击V2上的按钮跳转会V1、点击V3的按钮跳转会V1
可以在Storyboard中做以下操作:
1、在V1中实现以下方法
- 这个方法有两点要求
- 需要有
@IBAction
修饰 - 参数需要为
UIStoryboardSegue
类型
- 需要有
@IBAction func goBack(segue: UIStoryboardSegue) {
print("哈哈哈哈")
}
2、在V2、V3选中对应按钮,control+draging到对应控制器的以下地方
3、如果在V1中实现了1步骤中方法,就会出现以下图片
Snip20160104_2.png
4、选择对应的方法,当点击V2、V3对应按钮时,就会进行跳转,并且执行这个方法
闭包中使用属性
swift闭包中使用属性,必须要加self
,因为swift要提醒程序员,闭包中可能会造成循环引用
![
swift代码风格
swift类中定义静态变量
Snip20160104_4.png属性监视器中设置属性额外操作
Snip20160104_5.png如上,在属性监视器中,可以设置以下操作:
- 1、
当将要设置视图的这个约束时,就将原先的这个约束清除
- 2、
当设置完这个约束之后,就将这个约束设置到view上
这两步充分利用了属性监视器,要是原先OC的写法,这两步操作就和属性分离了,得在设置属性的地方进行上面两个操作,或者得在setter方法中设置。
上面的属性是在这个属性的set方法中设置的
在属性监视器中设置属性的一些值
dataSource的设置可以放在属性监听器里面,delegate也是同理
给view添加手势也可以在属性监视器中
关于IBOutlet没有初始化的预防
Snip20160104_10.png- 这里的scrollView采用
可选链
来访问属性,是因为在设置image图片时,IBOutlet可能还没有设置
- 这里的image
计算属性
,相当于imageView存储属性
的set和get方法,方便对其进行操作
- 主要是设置完imageView可以使用set,来对scrollView进行设置
- 对scrollView一些属性的操作,可以放在scrollView已经被设置方法即
didSet
里面
多线程注意
Snip20160104_11.png- 多线程写法
- 上面判断url是因为可能这次请求数据没到,下次就来了,所以需要判断