Swift
一.Swift简介
Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。
Swift是一款易学易用的编程语言,它与Java和JS很像,不论其方法还是属性都是用点语法,而且其语法简明,只有.swift文件,这点它比OC方便很多,不像OC那种到处都是@和[ ]。这就使得其他语言从事者很好的融入苹果的开发环境中来,自从接触了Swift编程,看到JAVA和JS代码就感到亲切,
接触Swift也是一个偶然机会,有段时间公司项目上架后没有什么事情可做,领导开会说下一个项目最好用Swift来做,自己就从网上和书中自学起来Swift,学习了又一个月,就开始尝试着做公司计划的项目,说实话,开始有很多不习惯,毕竟之前的项目都是用OC做到,而且Swift语言并不成熟,有的时候会莫名报错或者提示不智能,在做项目的过程中每次敲到UIFont类基本上都会变黑甚至Xcode闪退,但这并不能阻挡我对Swift的热忱,由于苹果底层使用OC写的,Swift程序在Xcode编译的时候底层还是转换成了OC,所以现在Swift存在诸多问题很正常,没有一门语言是一出生就是完美无瑕的,即使强大的JAVA经历过那么多年的提炼还是存在令人不满意的地方,还有很重要的一点,苹果不在闭关锁国,Swift是门开源的语言,这就意味着Swift会想Java那样融合各种优秀的编程思想.总体感觉,熟练使用Swift后比OC的编程效率要高很多!
- Swift声明一个类只会生成一个.swift文件,通过Public和private关键字确定该方法是否暴露在外界
这里为大家推荐一本学习Swift用到的书,感觉不错,值得学习!
Paste_Image.png二.Swift学习
Swift给我印象最深也是最让人蛋疼的地方,它对数据类型要求特别严格
import UIKit
/// VM专门来负责模型相关的操作
class WKUserAccountViewModel: NSObject {
// 单例
static let sharedInstance: WKUserAccountViewModel = WKUserAccountViewModel()
private override init() {
super.init()
// 从沙盒里面加载账号
userAccount = loadUserAccount()
}
// 账号的路径
private let accountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingString("/account.plist")
// 账号 userAccount是在内存中,访问速度快.
var userAccount: WKUserAccount?
// 是否登陆,只读计算型属性
var userLogin: Bool {
get {
return userAccount != nil
}
}
像上面代码中如果你创建一个对象,在OC中直接表明了其类型,例如: NSString str = [NSString alloc]init];这里str就确定是NSString,但在Swfit它会根据右端去推测左端你声明对象的类型,如果你只是单纯的创建对象,那么它就是可变类型,使用Var关键字和?例如上面代码中: var userAccount:WKUserAccount? 也就是说你声明的这个userAccount对象是个可变类型的对象,可能是WKUserAccount类型可能是nil.这样你下面如果使用这个对象的话就得拆包,强制拆包有风险!就像我告诉你了这个对象可能不存在,你又当成有对象来处理,那么我就崩给你看!好吧,没有代码我解释的有点不形象,不过实际运用中就是这样拆来拆去,这样的好处就是在程序出问题的时候可以快速定位. 而像上面代码中 accountPath 我声明变量的时候就给你赋了值,这样相当于它就是个常量用let修饰,就不是可选类型.
private let accounPath=NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingString("/account.plist")
关于Swift的特有语法格式:可选类型
Swift中的可选:可选不能直接拿来操作
1. .!: 强制拆包.拿到可选里面的真正的值,强制拆包如果没有值会崩溃
1.如果确定没问题就强制拆包
2.如果不确定,判断不等于nil才拆包.或者可选绑定
var aa: Int? = 10
if let a = aa { // 先判断aa是否有值,如果aa有值,就将aa强制拆包,让后赋值给a
// 在代码里面直接使用a就可以,不用在拿着aa在强制拆包
} else {
// 如果aa没有值.直接进入到这个分支
}
2.?:
1.statuses?.count ?表示statuses才往后面执行,如果没有值就停下来不执行后面的代码,并且整个表达式返回nil
2.delegate?.visitroViewDidClickLoginButton?(): visitroViewDidClickLoginButton?()表示,兑现实现了这个方法就调用这个方法,如果没实现就不调用这个方法,并且返回nil
5.??
1. statuses?.count ?? 0: ?? 前面的可选是否有值,如果有值就使用前面的值,如果前面的可选没有值,为nil 就会使用 ?? 后面的值
3.as?
1.let dict = result as? [String: AnyObject]: 将result来类型转换成 [String: AnyObject],as?表示我们认为可能转成功也可能转失败,所以类型转换的结果是一个[String: AnyObject]?,真的转失败了以不会崩溃只会返回nil
4.as!
1.let dict = result as! [String: AnyObject]:将result来类型转换成 [String: AnyObject],as!表示我们认为一定能够转成功,所以类型转换的结果是一个[String: AnyObject],不会带?,但是一旦装换失败,程序就崩溃了
5.nameLabel?.text = status?.user?.screen_name,当使用可选赋值的时候,需要看左边的变量的类型
三.Swift和OC的相互转换
1.OC使用Swift的类,需要导入 "产品名称-Swift.h", 产品名称不要数字开头,也不要包含 - #import "单例-Swift.h"
2.Swift使用OC的类,需要桥接文件,系统会自动创建这个文件,在桥接文件里面 #import "WKTestView.h",注意如果使用Pod管理的不需要桥接,只有自己写的或拖进来的OC文件才需要桥接
3.著名的AutoLayOut库Masonry团队专门为Swift环境下写了SnpKit,用法和OC环境下的Masonry略有差别,很多著名的类库都写了Swift环境下专用的库,这样不仅是简省了引用者的使用步骤,也提高了其内部编译效率.