swift 3.0的一些技巧

这段时间称着工作不是很忙一直在接触swift3.0,所以就把我这段时间学习的一些成果分享给大家。我就一些普通项目中用到的技术展开说明:

注意:此篇文章适合有一些swift基础的人阅读,如果文章中有什么不合理或者不对的地方欢迎大家指出,谢谢!

1、语法篇:

随之swift4.0推出,swift的从3.0开始语法都接近成熟,完善。swift的语法相对于OC来说变的想当简单:
1、swift语法都采用链式方式进行访问属性(也就是“.”),比如初始化一个Button并设置它的相关属性

addBtn.setImage(kImageName("add_channel_titlbar_thin_new_night_16x16_"), for: .normal)
addBtn.frame=CGRect(x:kScreenWidth40,y:0,width:40,height:40)
addBtn.setTitleColor(UIColor.white, for: .normal)
addBtn.addTarget(self, action:#selector(addBtnClick), for: .touchUpInside)  

2、swift没有强制类型转换,所有不同类型的操作都需要手动做类型转换,比如

let cell = collectionView .dequeueReusableCell(withReuseIdentifier:CollectCellID, for: indexPath)  as! UICollectionViewCell
(这里的"as"关键字就是做类型转换的)

如果需数字之间相互转换,怎可以这样写
va rdoubleNumber =1.8 
var intNumber =0
intNumber = Int(doubleNumber)
println(intNumber)

3、懒加载

swifi中懒加载使用一个新的关键字“lazy”进行声明,具体写法如下

  lazy varbottomLine:UIView = {
  letbottomLine =UIView()
  bottomLine.backgroundColor= .red
  bottomLine.height=2
  bottomLine.y=37
  return bottomLine
}()    这里声明了一个View,并做了一些初始化操作

4、注册表格Cell和表格Cell的初始化

一、加载有xib的cell

注册
mainTableView.register(UINib.init(nibName:String(describing:UITableViewCell.self), bundle:nil), forCellReuseIdentifier:String(describing:UITableViewCell.self))

加载cell
let cell =Bundle.main.loadNibNamed(String(describing:UITableViewCell.self), owner:nil, options:nil)?.lastas!UITableViewCell

二、加载用代码纯撸的

注册
mainTableView.register(UITableViewCell.self, forCellReuseIdentifier: MAINCELLID)

加载
let cell = tableView.dequeueReusableCell(withIdentifier: CELLID) as! UITableViewCell

5、didSet和willSet方法

在Swift语言中用了willSet和didSet这两个特性来监视属性的除初始化之外的属性值变化,下面通过一个例子来说明他们的用途

"import Foundation
class People : NSObject
{
    //普通属性var firstName:String =""var lastName:String=""var 
    nickName:String=""//计算属性var fullName:String
{
get{
    return nickName+""+ firstName +""+lastName
    }
//带属性监视器的普通属性var age:Int =0{//我们需要在age属性变化前做点什么willSet

println("Will set an new value \(newValue) to age")
}
//我们需要在age属性发生变化后,更新一下nickName这个属性

  didSet
  {
       println("age filed changed form \(oldValue) to \
      (age)")ifage<10{
      nickName="Little"}else{
      nickName="Big"
   }
}
func toString()->String
{
    return"Full Name: \(fullName)"+", Age: \(age)"}
}
var me=People()
me.firstName="Zhang"me.lastName="San"me.age=20println(me.toString())"

6、Extension
swift的extension可以做如下几件事,

  • 添加计算属性 - computed properties
  • 添加方法 - methods
  • 添加初始化方法 - initializers
  • 添加附属脚本 - subscripts
  • 添加并使用嵌套类型 - nested types
  • 遵循并实现某一协议 - conform protocol

其实说白了我感觉extension的作用就是把一些相同的操作,放到一起,就比如某些系统的代理,运算某些数值。这样可以增加代码的可读性和条理性,方便后期维护代码

7、格式输出符
在OC的时候我们一般通过NSString的stringWithFormat来对文本进行修饰,但是在swift里这个操作将变的非常简单,

let str = "\(commond)" + "评论"
或者
let str = "\(commond)评论" 这里的\是带有转义字符的效果

8、可选类型
相信你们在学习可选类型的时候,一定会很痛苦,到底什么时候用“!”和什么时候“?”但是不加的时候一定会报错。其实我当时也郁闷了一段时间,但是随着代码的越写越多渐渐的对他们了解的更加透彻。这里还是引入苹果的一段说法:Swift是一门安全的编程语言. 正如苹果所言, 可选类型就是证明Swift是一门安全的编程语言的一个小例子. 如上面的例子所示, Swift的可选类型提供了在编译阶段就检查一些可能在运行时才会出现的常见错误的机制. 我在做项目的时候有时候碰到一个数字或者字典为空或者没有被初始化,这样可能会导致程序崩溃,但是如果用到苹果的可选类型的话这个问题可能就会不容易发生。在可选类型后面加一个感叹号(!)来表示它肯定有值.这叫做硬解包.也就是说如果你不给他赋值编译器是编译通过不了的;在可选类型后面加问号(?)则代表变量有时候可能是空的,也有可能不为空

9、文件引用
swift对于项目内的文件是不需要添加头文件引用的,只有对于项目之外没有添加引用关系的文件才会需要收到引用一次,但是只需要引用一次就可以整体项目里使用。比如通过cocoaPod添加的文件和一些系统的文件等等

2、工具篇

在这一篇,我总结了一些常用的工具和函数

/// idfv
let idfv =UIDevice.current.identifierForVendor?.uuidString
/// 版本号
let versionCode =Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String
/// 系统版本号
let systemVersion =UIDevice.current.systemVersion

//MARK: - 列举一些常用宏

// log方法
funckLog(_message:T, file:String=#file, funcName:String=#function, lineNum:Int=#line) {

#ifDEBUG
letfileName = (fileasNSString).lastPathComponent
print("\(fileName)---\(funcName)---\(lineNum):\(message)")
#endif
}

// MARK: - Color

/** RGBA的颜色设置 */
funckRGBA(_r:CGFloat, g:CGFloat, b:CGFloat, a:CGFloat) ->UIColor{
return UIColor(red: r/255.0, green: g/255.0, blue: b/255.0, alpha: a)
}

/** 0xFF0000的颜色设置 */
funckColorHexA(_hex6:UInt32, alpha:CGFloat=1) ->UIColor{
letred = CGFloat((hex6 &0xFF0000) >>16) /255.0
letgreen = CGFloat((hex6 &0x00FF00) >>8)/255.0
letblue = CGFloat((hex6 &0x0000FF))/255.0
return UIColor(red: red, green: green, blue: blue, alpha: alpha)
}

/** 随机颜色 */

funckRandomColor() ->UIColor{
let randomRed = CGFloat(arc4random_uniform(256))
let randomGreen = CGFloat(arc4random_uniform(256))
let randomBlue = CGFloat(arc4random_uniform(256))
return UIColor(red: randomRed/255.0, green: randomGreen/255.0, blue: randomBlue/255.0, alpha:1.0)
}

//** 字体大小 */
funckFont(_size:CGFloat)->UIFont{
returnUIFont.systemFont(ofSize: size)
}

/** 访问图片 */
funckImageName(_name:String)->UIImage{
return UIImage.init(named: name)!
}

3、第三方常用库篇

网络请求

  • Alamofire 著名的 AFNetworking 络基础库 Swift 语言版

  • AlamofireImage 基于 Alamofire 的网络图片组件库

  • NetReachability 检查网络连接的连通性

  • SwiftyJSON GitHub 上最为开发者认可的 JSON 解析类

图片选择、浏览 (这部分swift库真少呀 欢迎知道的补充)

  • PhotoBrowser-swift 图片浏览

  • PhotoPicker swift图片选择

  • BSImagePicker 这个图片选择 不错,oc和swift都有 真贴心呀

约束Autolayout

SnapKit

总结

swift是一门很强大的语言,我总结的可能只是占很少一部分,后续我也会在加一些东西。最后感谢你能阅读我的文章!

你可能感兴趣的:(swift 3.0的一些技巧)