在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1、在学基本语法之前,简单看一下与OC的不同 注释:OC #pragma marks 视图加载完成 Swift //MARK: 视图加载完成 //TOOO:设置背景颜色(Xcode 8.0 特有) //FIXME:更改头像 创建一个视图View: OC [[UIView alloc]initWithxxx:]; Swift UIView(xxx:) 类名() == alloc/init 等价 类方法: OC [UIColor redColor]; Swift UIColor.red 2.0 UIColor.redColor 访问当前对象的属性,Swift可以不使用self.: OC [self.view addSubview:v]; Swift view.addSubview(v) 建议:都不用,在编译器提示的时候再添加,会对语境有更好的体会 原因:闭包(类似OC block),需要使用self. 没有";" ";"目的分割语句的,在Swift中,默认不需要 枚举类型: OC UIButtonTypeContactAdd Swift ‘.’contactAdd 监听方法 OC @selector Swift #selector 如果带参数不使用‘:’ 2.0 直接使用"",如果带参数使用‘:’ 调试 Swift print 没有时间 效率比NSLog更高 跟踪函数 OC __FUNCTION__ Swift #function //2.0语言print(__FUNCTION__) //3.0语言 print(#function) 2、常量与变量 1》 关于常量let和变量var的选择: 不可变的会更加安全,开发时,通常使用let,再需要改变的时候,再改成var 2》如果一个变量从未被改变,会提出警告 //Variable 'x' was never mutated; consider changing to 'let' constant //变量x从来没有被修改,建议使用let 3》修改视图属性,依然使用常量 let v = UIView() //仅仅修改v的属性,并没有修改v的指针地址 v.backgroundColor = UIColor.redColor() 4》如果需要指定变量和常量的类型,可以使用 let x:类型 = 值 提示:在Swift开发中,极少使用直接指定类型,通常都是自动推导 5》定义变量var,定义后可以修改;常量let,定义之后不可修改 自动推导变量和常量的类型会根据右侧的代码的执行结果,推导对应的类型 热键:option + click 查看类型 整数:Int 与OC中的NSInteger类似 小数:Double 与OC中的CGFloat类似 6》在Swift中对类型要求异常严格 任何不同类型的数据之间,不允许直接运算,不会做默认隐式转化,所有的数据类型确定都要由程序员负责 7》Swift不在基本数据类型,都是结构体 3、可选项Optional (1)原始的可选项定义(None 没有值 或者 Some某一类值) let x:Optional = 10 (2)简单的定义 '?'用来定义 y是一个可选项的整数类型 let y:Int? = 20 如果不进行初始化会直接报错: Constant 'y' captured by a closure before being initialized //常量y使用之前必须初始化 不同类型之间的值不可以直接运算,如果没有值则默认nil,不是任何数据类型,不参与计算,print(x+y)提示错误; 解决:'!'强行解包,在可选值中选择非空值,如果值初始化为nil,会崩溃
定义y,没有初始化 let y:Int? 给常量设置数值,初始化的工作能做一次 y = 20 //两次修改常量会报错 //y = 3 var 的可选项默认为nil //let 的可选项没有默认值 var x:Int? //输出nil x = 10 x = 100 //输出可选项100 print(x) 4、逻辑分支 1>简单的分支 a.条件不需要() b.语句必须有{} if x < 6 { }else { } 2>三目(三目语法跟OC一样) x > 5 ? print() : print() 有时候使用'()'表示空执行 x > 5 ? print() : () 3>switch /* 1.switch 可以针对任意类型的值进行分支,不在局限整数 2.switch 一般不需要break 3.switch 如果多时,使用',' 4.所有的分支至少需要一条指令,如果什么都不干,才使用break */ func demo(num: String){ //let num = 10 switch num { case "10","9": print("优") case "8": break default: print("一般") } 特殊的使用,不经常出现 let point = CGPoint(x: 10, y: 10) switch point { case let p where p.x == 0 && p.y == 0: print("原点") default: print("") } 5、可选的判断 1、if let 和 guard let 的技巧: 使用同名的变量接收者,在后续使用的都是非空值,不需要解包; 好处:可以避免命名的烦恼 guard 守卫/守护 guard let 和 if let 刚好相反 if let name = name,age = age { //非空的name和age仅在{}有效 print(name + String(age)) print("------------") }else{ print("姓名或者年龄为 nil") } //guard let 守护一定有值,如果没有直接返回 guard let name = name,age = age else{ print("姓名或者年龄为 nil") return } //代码执行至此,name和age一定有值 //通常判断是否有值之后,会做具体的逻辑实现,通常代码多 //如果用if let 凭空多了一层分支,guard是降低分支层次的办法 //guard 是Swift 2.0之后推出的 print(name + String(age)) 2、if let/var 连用语法,目的就是判断值 //不是单纯的if
if oName != nil && oAge != nil {
print(oName! + String(oAge!))
}
//if let 连用,判断对象的值是否为nil,{}内一定有值,可以直接使用,不需要解包
//if var 连用,{}内可以对值进行修改
if var name = oName,let age = oAge {
name = "老李"
//进入分支之后,name 和 age 一定有值,不需要解包
//name age 作用域仅在{}中
print(name + String(age))
}else{
print("name 或者 age 为nil")
} 3、?? ??是一个简单的三目 如果有值,使用值 没有值,使用 ?? 后边的值代替 //?? 操作符的优先级低 ,在使用的时候最好加上() print((x ?? 0) + (y ?? 0))
|
请发表评论