swift 3.0

swift3.0学习

可选值

  • 可选值:有可能被设置为nil,所有类型都可以被设置.?表示不能拿来运算.!强制解包,如果没有值会崩溃.swift中不会给变量或常量赋初值.

  • 空合运算符:??使用可选值的时候使用.如果有值使用可选值,无值使用后面一个

  • 可选绑定:在条件判断语句中,定义一个临时的变量或常量x,将可选值y的值,赋值给x.如果y有值,则赋值成功,可以使用x,如果y没有值,绑定不成功,可以做异常处理,简称iflet,另一个guardlet,可以减少代码的层级.
    iflet

//可以避免频繁的使用?和!
var  a1:Int? =5
var  b1:Int? =10
if let x = a1{
    let c = x + 10
}else{
    print("a1没有值")
}
if let a1 = a1, let b1 = b1,b1>5,a1>2{
    let c1 = a1 + b1
}

guardlet

func testguard(){
    guard let a1 = a1,let b1 = b1,b1>5,a1>2 else{
        return
    }
    let c1 =a1+b1+5
}

可选值举例说明

let string = "http://www.baidu.com/哈哈"
let url = URL(string:string)
在开始时是nil,所以是可选值
var window: UIWiondow?

复杂的数据类型

  • 字符串
//let 定义一个不可变的字符串,var定义一个可变的字符串
let str:String = "hello,world"
var str1:String = "hello"
str1.append(",love you")
str.append(",love you") //报错
//拼接 
var str2 = str +str1
str2 += ",love you"
//与变量常量拼接,最常用
let name = "xiaoming"
var str3 = "hello,\(name)"
let h = 5, m= 5,s = 5
let time = String(format:"%02d:%02d:%02d",h,m,s)
//字符串的比较,最常用
var stra = "hello"
var strb = "hello"
if stra == strb{}
//字符串是否有前后缀
let result = stra.hasPrefix("h") //前缀
let result1 = stra.hsaSuffix("loa")//后缀
//字符串长度(个数)
let count = strc.characters.count
//字符串的长度(字节数)
let countbytes= strc.lengthOfBytes(using:String.Encoding.utf8)
//range
let strd = "hello,girl"
let index2 = 1
let index3 = 3
let rang = 1...3
let startIndex = strd.startIndex
let endIndex = strd.endIndex
let secondIndex = strd.index(startIndex,offsetBy:1)
let fourIndex = strd.index(startIndex,offsetBy:3)
let swiftRange = secondIndex..<fourIndex
let subStr = strd.substring(with:swiftRange)
//range简单用法
let stre = (strd as NSString).substring(with:NSMakeRange(1,3))//as 类型转换
  • 数组
//可变不可变
let arr = ["dog","cat","pid"]
var arr1 = ["dog","cat","pid"]
var arr2:[String] = Array()
var arr3:[String] = []
//数组的遍历
for item in arr1{
    print(item)
}
for item in arr1.enumerated(){
    pring("\(item.element),\(item.offset)")
}
for item in arr1.enumerated().reversed(){
    pring("\(item.element),\(item.offset)")
}
//生成新的倒序数组
let reversedArray = Array(arr1.reversed())
//数组的拼接
let array1 = ["dog","cat"]
let array2 = ["pig","goat"]
var array3 = array1 + array2
//增
array3.append("cow")
//删
array3.remove(at:2)
//改
array3[1] = "snake"
  • 字典
//字典的定义
let dic = ["first":"dog","second":"cat"]
var dic1 = ["first":"dog","second":"cat"]
dic1["second"]=nil
let first = dic1["first"]//返回可选值
let dic3:[String:String] = Dictionary()
let dic3:[String:String] = [:]
//Any 和AnyObject
//任何类型和对象
//字典的遍历
let dic5 = ["first":"dog","second":"cat"]
for (k,v) in dic5{
    print("\(k),\(v)")
}
let keys = Array(dic5.keys)
let values Array(dic5.values)
//字典的操作//字典的操作都是围绕key值做操作
//增
dic6["third"]= "pig"
//删除
dic6["first"]= nil
//改
dic6["second"]= "snake"
//查,返回的是可选值
let second = dic6["second"]

函数和闭包

  • 函数
    func 函数名 (参数1:类型,参数2:类型) -> 返回值类型{}
    函数参数的默认值,一旦设了默认值,该参数可传可不传.
func addNum(a:Int=5,b:Int)->Int{
    return a + b 
}
addNum(b:20)
func methodOne () ->Void{
    print(#function)
}
//Void是一个空的元组
methodOne()
//有参数没有返回值
func add(a:Int,b:Int){
    print("\(a)和\(b)相加,值是\(a+b)")
}
add(a:5,b:10)
//有参数,有返回值
func caculate(a:Int,b:Int)->Int{
    return a + b
}
let result = caculate(a:5,b:10)
//函数的参数
//first叫外部参数名,对参数a做解释说明用的
//swift默认给函数的每一个参数都加了一个和形参名字一样的外部参数名,也可以自己定义外部参数名.
func caculatea(first a:Int,second b:Int)->Int{
    return a + b
}
let result = caculatea(first:5,second:10)
//我们也可以选择忽略外部参数名
func caculateb(_ a:Int,_ b:Int)->Int{
    return a + b
}
let result = caculateb(5,10)
//外部参数名,如果不忽略就必须传
  • 闭包:是一个匿名的函数块.函数就是闭包,闭包就是函数,本质就是函数指针.闭包被完整的包括在{}里.

闭包的定义和调用

//定义一个无参无返回值的闭包
func methodOne(){
    print("hello")
}
methodOne()
let closureOne = {
    print("hello")
}
closureOne()
//定义一个有参数,无返回值的闭包
func methodTwo(a:Int,b:Int){
    print("a+b =\(a + b )")
}
methodTwo(a:5,b:10)
let closureTwo = {
    (a:Int,b:Int) in 
    print("a+b =\(a + b )")
}//不会默认给参数添加解释名
closureTwo(5,10)
//定义一个有参数,有返回值的闭包
func methodThree (a:Int,b:Int)->Int{
    return a + b
}
let result = methodThree(a:5,b:10)
let clousureThree={
  (a:Int,b:Int)->Int in
    return a + b
}
let result = clousureThree(5,10)

异步加载的时候使用

//下载一部movie,完成后更新ui

尾随闭包

当闭包可以写在函数的最后一个参数,可以写在函数外面.
如果函数只有该闭包表达式一个参数,则连小括号都可以省略

deinit{
    print("byebye")
}
  • window的设置


    Snip20160928_1
  • 循环引用
Snip20160928_8.png
downloadMovie{
    [weak self](movie:String) in
    self!.label.text = movie
}
  • 闭包修饰符
Snip20160928_9.png

总结

Snip20160928_10.png

swift3.0

类与对象

class Person:NSObject{}
protocol personDelegate:NSObjectProtocol{}
struct MyRect{}
enum MyCase{}
class Dog:NSObject{
    var name = "旺财"
    
    init(name:String){
        self.name = name
    }
    //便利构造器,必须调用指定构造器完成构造过程
    convenience init(namea:String){
    self.init(name:namea)
    }
}
class Person:NSObject{
    //存储属性,节省cpu,消耗cpu
    var name:String
    var age:Int
    //可选属性,代表这个属性可能有值,可能是nil
    var girlFriend:String?
    //计算属性,一定有return值的,节省内存,消耗cpu
    var kindName:String{
        return "亲爱的\(name)"
    }
    //懒加载属性
    lazy var pet :Dog = Dog()
    lazy var pet: Dog = {
        ()->Dog in
        let dog = Dog()
        dog.name = "小白"
        return dog
    }()
    //构造函数,创建一个对象(完成类的构造的方法)
    //构造函数,可以有多个,都叫init
    init(name:String,age:Int){
        self.name = name
        self.age = age
        //自动调用super.init()
    }
    
}

let xiaoming = Person(name:"xiaoming",age:20)
print("name:\(xiaoming.name),age,\(xiaoming.age)")
//就是调用一个方法
let kindname = person.kindName
let pet = person.pet


  • 类的属性
    存储属性:一直保留
    计算属性:调用后立即创建和释放,相当于一个函数
    可选属性:属性可以被设置为nil
    懒加载属性:调用时初始化

  • 初始化
    只需要考虑存储属性

Snip20160928_12.png

1.创建一个类,如果没有自己实现构造函数,会有一个默认的构造函数,就是init(){super.init()},指定构造器
2.一旦定义了自己的构造器,则默认就失效
3.便利构造器,简化类的构造过程

let button = UIButton(type:.contactAdd)
  • kvc构造器

kvc是基于运行时的,运行时是oc的特性.在swift中,使用kvc时,如果基本的数据类型设为可选,是不兼容的.可以给基本的数据类型,设一个初值

import Foundation
//kvc构造函数:
class Person:NSObject{
   var name:String?
   var age:Int? = 0
   
   init(dict:[String:Any]){
    super.init() //调用完成后,对象已经被创建
    setValuesForKeys(dict)
   }
   override func setValue(,forUndefinedkey ){}
}

重载:参数不同.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容

  • 这是我对 Swift 3.0 整理的笔记,主要内容来自于官方文档,添加了一些指针的内容在最后。该笔记由于只是我个人...
    黄穆斌阅读 2,831评论 19 59
  • 花了周末的时间翻译raywenderlich.com的Swift编码规范(传送门), 原文是针对写作时Swift代...
    豆志昂扬阅读 7,602评论 2 43
  • 前言 Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于...
    践行者_Leng阅读 764评论 2 1
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,790评论 1 10
  • swift30快速入门 常量与变量 控制流 函数和闭包 对象和类 swift30-将元组加到数组中 swift-数...
    XLsn0w阅读 462评论 0 0