一下笔记是在学习swift的时候做的,比较乱,可以将就的看一下,swift这一门语言我认为是比较理性理想的,比oc来说感觉更合理,如果swift真要是熟练了,在开发过程中肯定比oc简单的多.
常量与变量
/*
let:常量一经赋值就不能被更改
var:变量可以被更改
尽量使用常量等到需要修改的时候在改成使用var来修饰
option + click最常用的热键值没有之一
在swift中整数的默认类型是Int OC中: NSInteger
小数的默认类型是Double
OC没有默认的小数类型
1.swift中数据的类型是自动推导的根据'='右边的类型来去推断变量的具体类型
2.swift是一个类型极其苛刻的语言
3.不同的数据类型之间不能够直接运算swift中不支持隐含形式的转换类型
4.提前声明类型: let变量名:类型
可选项与必选项
//可选项: ?(有值吗) 1.有值2.没有值(nil)
//必选项: !程序员承诺一定有值同样也表示强制解包
//可选项是OC程序员接触到swift最不适应的一个地方
//1.加强对可选项的理解
//2.可以根据Xcode的智能提示来进行解决
//3.每添加一个'!'的时候都需要思考为什么,安全吗程序员承诺一定有值
//fatal(致命的) error: unexpectedly found nil while
unwrapping(解包) an Optional value
/*
1.可选项在打印的时候会自动带上Optional(10)
2.可选项不能够直接参与运算
*/
funcdemo1() {
//声明可选项在类型后面追加'?"
vara:Int?
if(a !=nil){
print(a! +10)
}
}
swithc case
//switch
case
//1.每个case分支必须要有一段可以执行的代码
//2.临时变量的定义不需要加在{}中
//3.OC中只能判断基本数据swift中可以判断任意类型(字符串)
//4.可以同时case多个选项
//5.不需要写break
funcdemo7() {
letm ="22200"
switchm {
case"18000","22200":
leti =10
print("高级工程师")
case"8000":
print("初级工程师")
default:
print("你是猴子派来的吗")
}
}
"??"双问好操作符
// ??在判断字符串或者基本数据类型的时候用处很大
//操作符:快速判断可选项是否为nil如果为nil给定默认值
//
tableView数据源方法list?.count ?? 0
funcdemo6() {
vara:Int?
//必选项
letb = (a ??1) +10
print(b)
}
分支结构
//guard(守卫) let ... else和if let的作用刚好相反
//能够减少一层分支嵌套
//Xcode
7.0 swift2.0才推出的语法
//在项目使用的非常多
funcdemo5() {
leturlString
="http://www.douni.com?type=中国"
guardleturl =NSURL(string: urlString)else{
//如果url为nil当前代码就直接返回
return
}
//程序运行到这里'守卫'的对象就一定有值
letrequest =NSURLRequest(URL: url)
print(request)
}
//
if let快速赋值并且判断是否为空不为空才能够进入分支意味着值就是一个必选项
funcdemo4() {
//url中包含中文需要转义
leturlString ="http://www.douni.com?type"
ifleturl =NSURL(string: urlString) {
letrequest =NSURLRequest(URL: url)
print(request)
}
}
weak和unowned的区别
weak回收掉时自动指向nil安全unowned相当于assign,回收掉的时候指向原来的地址,是野指针不安全
swift面向对象的初始化过程-->先初始化子类-->再初始化父类和oc相反
重写是父类有同样的方法或者属性
重载是面向对象的,相同的方法名得到不同的功能
Git.OSChinaNeXTSTEP
函数的应用
/*
swift中调用本类的函数和属性self可以省略也可以加上闭包内调用本类的函数和属性时必须加self
*/
classViewController:UIViewController{
overridefuncviewDidLoad() {
super.viewDidLoad()
//函数的调用
//函数的第一个参数名称可以省略
//
let result = square(width: 10, height: 20)
//
print(result)
}
//函数的外部参数
//外部参数width是提供给调用方来进行使用的
//内部参数a是提供给函数内部使用的
funcsquare(width a:Int,heightb:Int) ->Int{
returna * b
}
//函数没有返回值的三种写法
//1.没有返回值的第一种写法
funcdemo1() -> () {
print("哈哈哈")
}
//2.第二种写法Void V要大些
funcdemo2() ->Void{
print("嘻嘻嘻")
}
//3.函数没有返回值的第三种写法
funcdemo3() {
print("黑hi额hi额")
}
便利的构造函数
convenienceinit?(name:String, age:Int){
//通常年龄需要做合法性的检查让一个人年龄在一个合法区间内
ifage <0|| age >1000{
//不能够实例化该对象必须是失败的构造器才能够返回nil
returnnil
}
//保证对象在满足条件下能够被实例化
//生写指定构造函数
self.init(dict:["name": name,"age": age])
}
便利构造函数是为本类中已经实例化的属性或者方法添加限制条件,调用本类的构造方法,使用self.init,不能用super和被重写,也可以被继承
在swift中创建项目名称的时候,如果项目名称是(数字.中文),会在向数组中添加元素可能会报野指针的错误,血的教训
类型转换as的使用
1.as, String <==> NSString[XXX] <==> NSArray[key : value] <==> NSDictionary
2.as?接收的数据类型是可选类型就使用as?尝试性的去转换一次
3.as!结束的数据类型是必选类型一定需要转换某一个类型
构造函数必须保证每个必选属性都初始化有初始值
2x对应是4和4s的屏幕尺寸3.5的屏幕640 x 960 pixels
Retina4对应的是5,5s,5c的屏幕640 x 1136 pixels
Retina4.7对应的是6和6s的屏750 x 1334 pixels
Retina5.5对应的是6plus和6splus的屏幕1242 x 2208 pixels
在众多类中找出自己要快速查看的代码
打开视图层次查看器找到对应的文件复制文件名
cmd+ shit + o快速查找文件
cmd+ shit + j快速定位文件
使用addTarget添加点击时候的时候,如果不希望外界访问方法前加private但是运行时候会蹦
因为一旦使用了addTarget在运行循环时候无法找到该方法
在方法前添加@objc告诉运行循环,这个方法是基于OC消息动态派发机制来执行的
//自定义访客视图
//默认的构造方法一旦从写init(frame方法会自动调用required init?(coder
aDecoder: NSCoder) {
overrideinit(frame:CGRect) {
//调用父类的构造方法
super.init(frame:frame)
setupUI()
}
//一旦重写了init(frame方法之后系统会默认该视图会通过手写代码创建
//系统就不会再让同构xib加载视图
//通过xib加载的UIView及其子类会调用这个方法
requiredinit?(coderaDecoder:NSCoder) {
//系统默认在这个地方执行报错
fatalError("init(coder:) has
not been implemented")
//如果重新了init(frame方法但是还想要从xib中加载试图,注释上面一行代码,调用下面一行代码
//super.init(coder:
aDecoder)
}
关于对loadVIew的使用
//用户是否登录的标记'
varuserLogin =false
//访客视图属性
varvisitorLoginView:VisitorLoginView?
//loadView方法是苹果专门为手写代码准备的方法一旦实现了该方法xib/sb就会失效
//在loadView方法没有调用super.loadView方法之前不能够追踪根视图(view)会自动检测view是否为nil如果为nil会自动调用loadView方法
//准备视图控制器的根视图
//自定义根视图就在这个方法中完成
//目标是根据用户是否登录来显示访客视图还是tableView
overridefuncloadView() {
ifuserLogin{
super.loadView()//加载tableview
}else{
//显示自定义的访客视图引导用户登录或者注册
visitorLoginView=VisitorLoginView()
//指定代理
visitorLoginView?.visitorLoginViewDelegate=self
//
v.backgroundColor = UIColor.purpleColor()
view=visitorLoginView