文档章节

Swift 3.0学习总结

Ethan-GOGO
 Ethan-GOGO
发布于 2016/10/23 11:30
字数 2434
阅读 29
收藏 0

1.数据类型

1).元组

//元组赋值
let http404Error = (404,"Not Found");
//元组分解
let (statusCode,statusMessage) = http404Error;
//元组分解不需要的用_代替
let (justTheStatusCode,_) = http404Error;
//索引数字访问元组
print(http404Error.0,http404Error.1);
print(statusCode,statusMessage,justTheStatusCode);
//给元组内部元素命名,可以通过其访问元素
let http200Status = (statusCode:200,description:"OK");
print(http200Status.statusCode,http200Status.description);

 2).类型转换

swift没有隐式转换,数据类型需要转换到相同类型才能共同操作。

let m = 3;
let n = 2.14;
let result = Double(m)+n;

2.运算符

1).??

合并空值运算符 ( a ?? b )如果可选项 a  有值则展开,如果没有值,是 nil  ,则返回默认值 b 。表达式a 必须是一个可选类型。表达式 b  必须与 a  的储存类型相同。

a != nil ? a! : b

let defaultColorName = "red"
var userDefinedColorName: String? // defaults to nil
var colorNameToUse = userDefinedColorName ?? defaultColorName

print(colorNameToUse) //red

2).闭区间运算符( a...b )

3).半开区间运算符( a..<b 

for index in 1...5 {
    print("\(index) times 5 is \(index * 5)")
}
for index in 1..<5 {
    print("\(index) times 5 is \(index * 5)")
}

3.集合类型

1).遍历数组的key和value

使用 enumerated()方法来遍历数组。 enumerated()方法返回数组中每一个元素的元组,
包含了这个元素的索引和值。你可以分解元组为临时的常量或者变量作为遍历的一部分:
for (index, value) in shoppingList.enumerated() {
    print("Item \(index + 1): \(value)")
}

2).有序遍历合集

Swift 的 Set类型是无序的。要以特定的顺序遍历合集的值,使用 sorted()方法,
它把合集的元素作为使用 < 运算符排序了的数组返回。
for genre in favoriteGenres.sorted() {
    print("\(genre)")
}
// Classical
// Hip hop
// Jazz

3).Dictionary的键值可以任意值

Set<Element>,Dictionary<Key, Value>,其中的Element,Key是用来作为字典键的值类型, 
Value就是字典为这些键储存的值的类型。
值类型是遵循Hashable协议.所有 Swift 的基础类型(比如 String, Int, Double, 和 Bool)
默认都是可哈希的,并且可以用于合集或者字典的键。
没有关联值的枚举成员值(如同枚举当中描述的那样)同样默认可哈希。

就像数组,你可以用初始化器语法来创建一个空 Dictionary:
var namesOfIntegers = [Int: String]()

2.逻辑语句

1).数字范围缩写

//半开半闭区间 0~9 => 0..<10
//闭区间 0~9 => 0...9

let source = 72;

switch source{
case 0..<60:
    print("不及格");
case 60...80:
    print("及格");
default:
    break;
}

2).if

    判断的条件必须只能是Bool类型,不再存在非0即真

    新增guard,else语句中一般是return、break、continue和throw

func online(age:Int){
    
    guard age >= 18 else{
        print("未成年");
        return;
    }
    
    guard age <= 60 else{
        print("年龄太老");
        return;
    }
    
    guard age < 30 || age > 50 else{
        print("回家");
        return;
    }

    print("可以上网");
}

online(40);

3).switch

//switch 支持int、string、dobule
//1.swift switch默认case后补break,如果想要穿透使用fallthrough
let sex = 0;

switch sex {
case 0:
    print("人妖");
    fallthrough;
case 1:
    print("男");
case 2:
    print("女");
default:
    print("未知")
}

//2.数字范围缩写
//半开半闭区间 0~9 => 0..<10
//闭区间 0~9 => 0...9

let source = 72;

switch source{
case 0..<60:
    print("不及格");
case 60...80:
    print("及格");
default:
    break;
}

3.循环语句

1)for

//swift3只支持这种写法了
for i in 0..<10{
    print(i);
}

//不需要用到下标
for _ in 0...10{
    

2)while

var m = 0;
while m < 10 {
    m += 1;//swift3不再支持m++这种写法了
    print(m);
}

repeat {
    m -= 1;
}while m > 0

4.函数

//内部参数 忽略参数名
func sum(num1:Int,_ num2:Int) ->Int{
    return num1+num2;
}
sum(2,5);

//可变函数
func sums(nums:Int...) ->Int{
    var total = 0;
    for n in nums{
        total += n;
    }
    return total;
}
sums(2,3,4,5,6);

//默认函数
func sex(s:String = "女"){
    print("sex:\(s)");
}
sex()

//指针函数
var m:Int = 3;
var n:Int = 2;

func swapNum(num1:inout Int,num2:inout Int){
    let temp = num1;
    num1 = num2;
    num2 = temp;
}

swapNum(&m, num2: &n);
print("m:\(m) n:\(n)");

5.枚举

//1.枚举类型的定义以及写法
enum MethodType1{
    case get
    case post
    case put
    case delete
}

enum MethodType2:String {
    case get="get"
    case post="post"
    case put="put"
    case delete="delete"
}

enum MethodType3 {
    case get,post,put,delete
}

//2.创建枚举具体的值
let type1 : MethodType1 = .get
let type2 = MethodType1.get
let type3 = MethodType1(rawValue:"put")
let str = type3?.rawValue

6.结构体

结构体是值类型,在方法中是值传递(对象是对象类型,在方法中是指针传递)

//1.定义结构体
struct Location {
    //成员属性
    var x : Double
    var y : Double
    
    //方法
    func test() {
        print("...")
    }
    
    //改变成员属性:涉及到改变成员属性的方法前需加上mutating
    mutating func moveH(distance : Double) {
        self.x += distance
    }
    
    //构造函数
    //1.默认下,会为结构体初始化一个带所有属性的构造函数
    //2.构造函数都是以init开头,并且构造函数不需要返回值
    //3.新构造的构造函数,必须保证所以的成员属性都被初始化
    init(x : Double, y: Double) {
        self.x = x
        self.y = y
    }
    
    //扩充构造函数
    init(xyStr : String) {
        let array = xyStr.components(separatedBy: ",")
        let item1 = array[0]
        let item2 = array[1]
        
        //Double(item1)是可选类型,有可能值为nil。如果强制解包let x = Double(item1)! 可能会崩溃
        /*
        if let x = Double(item1) {
            self.x = x
        }else{
            self.x = 0
        }
        if let y = Double(item2) {
            self.y = y
        }else{
            self.y = 0
        }*/
        
        //是上面的缩写,当值为nil的时候等于后值
        self.x = Double(item1) ?? 0
        self.y = Double(item2) ?? 0
    }
}


//2.创建结构体
let center = Location(x: 20, y: 30)
let moveH = Location(xyStr:"20,30")

7.类

1).类的定义

//1.OC定义类
//@interface Person : NSObject
//@end
//
//@impelment
//@end

//2.Swift定义类
class Person {
    
    //如果属性是值类型,则初始化为空值
    //如果属性是对象类型,则初始化为nil值(?的默认值是nil)
    
    //1.存储属性:用户存储实例的常量和变量
    var mathScore : Double = 0.0
    var chineseScore : Double = 0.0
    
    var view : UIView?
    
    //2.计算属性:通过某种方法计算得来结果的属性,就是计算属性
    var averageScore : Double {
        
        //简介写法
        //在类内部访问属性不需要加self.
        return (chineseScore + mathScore) * 0.5
        
        //完整写法
        /*
        set {
            
        }
        
        get {
            return (chineseScore + mathScore) * 0.5
        }
         */
        
    }
    
    //3.类属性 : 通过类名进行访问
    static var courseCount : Int = 0
    
    
    //OC中处理参数的方法 在swift中可以写成计算属性
    func getAverageScore() -> Double {
        return (chineseScore + mathScore) * 0.5
    }
}

//3.创建类的对象
let p = Person()
//类储存属性
p.view = UIView()
//类计算属性
p.mathScore = 90
p.chineseScore = 100
print(p.averageScore)
//类属性设置
Person.courseCount = 2

2.属性监听


class Person {
    
    var name : String = ""{
        
        //监听属性即将改变
        willSet(newValue){
            print(newValue) //打印新值 = "why"
            print(name)     //打印旧值 = "",属性还没改变
        }
        //监听属性已经发生改变
        didSet(oldValue){
            print(oldValue) //打印旧值 = ""
            print(name)     //打印新值 = "why",属性已经改变
        }
    }
}

let p = Person()
p.name = "why"

3.构造函数

/*
 使用KVC条件
   1>必须继承自NSObject
   2>必须在构造函数中,先调用super.init()
   3>调用setValuesForKeys
   4>如果担心新建对象的时候,字典里含有的key不属于成员变量,则复写setValue forUndefinedKey
 */

class Person:NSObject {
    
    var name : String = ""
    var age  : Int = 0
    
    //如果需要扩展构造函数,需要先实现init,否则会被覆盖
    override init(){
        
    }
    
    init(dict : [String : Any]) {
        //swift开发中,如果在对象函数中,用到成员属性,那么self.可以省略
        //但是如果在函数中,有和成员属性重名的局部变量,那么self.不能省略
        
        //通用属性少的时候我们可以这样写
        /*
         if let name = dict["name"] as? String {
         
         self.name = name;
         }
         if let age = dict["age"] as? Int {
         self.age = age;
         }
         */
        
        //属性多的时候我们可以使用KVC赋值
        super.init()
        setValuesForKeys(dict)
    }
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {}
    
}

let p = Person()
let e = Person(dict:["name":"why","age":18,"height":1.88])
print(e.age,e.name)

4.析构函数

//和OC的delloc方法一样,监听对象的销毁
class Person:NSObject {
    
    var name : String = ""
    var age  : Int = 0
    
    //重写析构函数,监听对象的销毁
    deinit {
        print("delloc")
    }
}

var p : Person? = Person()
p = nil

5.循环引用

class Person {
    var book : Book?
    
    deinit {
        print("person -- deinit")
    }
}

class Book {
    
    /*
     OC中的标识弱引用
      __weak/__unsafe_unretianed(当对象释放了,指针依然指向旧地址,所以容易野指针)
     Swift中表示弱引用
      weak/unowned(野指针)
     */
    
    //unowned 不能修饰可选类型
//    unowned var person : Person = Person()
    weak var person : Person?
    
    deinit {
        print("book -- deinit")
    }
    
}

var person : Person? = Person()
var book : Book? = Book()

person!.book = book;
book!.person = person;

//如果不使用弱引用这个时候析构函数不打印
person = nil;
book = nil;

6.可选链使用

class Person {
    var name : String = ""
    var dog : Dog?
}
class Dog {
    var weight : Double = 0
    var toy : Toy?
}
class Toy {
    var price : Int = 0
    
    func flying(){
        print("fly")
    }
}

let p = Person()
p.name = "why"
let d = Dog()
d.weight = 100.5
let t = Toy()
t.price = 5

p.dog = d
d.toy = t

//可选链 .? 系统会自动判断可选类型是否有值
//可选链--取值
/*
 写法非常危险,尽量不要强制解包
let dog = p.dog
let toy = dog!.toy
let price = toy!.price
 */

/*
 写法很繁杂
if let dog = p.dog {
    if let toy = dog.toy {
        let price = toy.price
    }
}
 */

let price = p.dog?.toy?.price

//可选链--赋值
p.dog?.toy?.price = 100

//可选链调用方法
p.dog?.toy?.flying()

8.协议

//: Playground - noun: a place where people can play

import UIKit

var str = "Hello, playground"

//1.协议的定义,默认协议中的方法都是必须实现
protocol SportProtocol {
    func playBasketll()
}

//2.遵守协议,可以遵循多个协议,逗号个隔开
class Teacher : NSObject,SportProtocol{
    func playBasketll() {
        print("踢足球")
    }
}

//3.协议的代理设计模式
/*
 定义协议时,协议后面最好跟上:class,
因为delegate的属性避免循环引用,用week修饰,而week只能修饰类、属性。协议可以被类遵守,也可以被枚举、结构体
 */
protocol BuyTicketDelegate : class {
    func buyTicket()
}

class Person {
    
    //定义代理属性
    weak var delegate : BuyTicketDelegate?
    
    func gotoBeijing() {
        delegate?.buyTicket()
    }
}

class Stundnt : BuyTicketDelegate {

    internal func buyTicket() {
        print("买票")
    }
}

let p = Person()
let s = Stundnt()
p.delegate = s
s.buyTicket()


//4.协议的可选方法
//optional属于OC特性,如果协议中有可选方法,那么必须在protocol前加@objc
@objc protocol TestPro {
    @objc optional func test()
}

9.检查API的可用性

Swift 拥有内置的对 API 可用性的检查功能,它能够确保你不会悲剧地使用了对部属目标不可用的 API。

if #available(iOS 10, macOS 10.12, *) {
    // Use iOS 10 APIs on iOS, and use macOS 10.12 APIs on macOS
} else {
    // Fall back to earlier iOS and macOS APIs
}

 

© 著作权归作者所有

上一篇: 栈、队列、链表
下一篇: 常用排序
Ethan-GOGO
粉丝 13
博文 174
码字总数 82033
作品 0
广州
私信 提问
fir.im Weekly - Swift 3.0 的迁移适配指南

无论你是移动开发者,还是桌面端开发者,或者正在IoT领域探索的技术人员,那么应该更加关注 iDev 全平台开发者大会,也许是后半年 iOS 开发者最盛大的技术盛宴。既有知名公司带来专业视野,又...

风起云飞fir_im
2016/10/18
140
1
Swift 3.0 将会带来什么

Swift 近两年的发展势头非常的迅猛,而在它开源后,更是如井喷一样的势头,除了 iOS 平台,还支持了 Linux。 而今年下半年, Swift 3.0 也会随之发布。这次我就和大家聊一下 Swift 3.0 会有什...

oschina
2016/05/01
10.8K
23
Swift 2.3升级到Swift 3.0小记

阿里云App从Swift 2.1开始使用Swift,随时不断的推进,现在所有的业务代码都用Swift编写。由于Swift 3.0语法上有诸多改变,所以从Swift 2.3升级到Swift 3.0是一件宜早不宜迟的事情。元旦期间...

阿呆少爷
2018/07/10
0
0
苹果公开 Swift 3.1 发布以及 Swift 4 开发时间

你是否已经准备好迎接新版本的到来呢? 苹果公司已经宣布他们将会在 2017 年春季发布 Swift 3.1,也就是说时间大约在 3 月到 6 月之间。 Swift 3.1 将可与 Swift 3.0 源码兼容,该核心编程语...

局长
2016/12/12
4.6K
37
Swift 4迁移总结:喜忧参半,新的起点

这次Swift 3 到 4 的迁移代码要改动的地方比较少,花了一个下午的时间就完成了迁移。Swift 把原来 4.0 的目标从 ABI 稳定改为了源码兼容,此次代码的兼容性做的确实很好,这个目标算是达到了...

没故事的卓同学
2017/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java System 类

Java System 类 System 系统类 主要用于获取系统的属性数据。 System类常用的方法: arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 一般 从指定源数...

Hellation
30分钟前
0
0
Nginx源码安装和调优技巧

本文内容 Nginx与apache的对比 实战1:在“腾讯云主机”上源码编译安装Nginx 实战2:Nginx调优之隐藏版本信息防止黑客扫描识别漏洞 实战3:设置网页缓存 实验环境: 使用RHEL6.5/centos6.5 6...

寰宇01
33分钟前
1
0
linux jenkins添加windows节点,实现自动化部署

背景: 要基于jenkins的做代码自动更新部署,现状是jenkins在linux上,目标服务器的tomcat在windows上,如何将代码从linux发送到windows未找到合适方案,并且后续如何远程调用执行windows批处...

shzwork
39分钟前
0
0
MySQL同表更新与查询冲突

MySQL version: 5.5 MySQL报错: You can't specify target table 'document_basic' for update in FROM clause 原因:MySQL不支持对同表同时更新+查询 解决方案:查询结果使用中间表接收,或......

Hzhodor
40分钟前
0
0
最长不重复字符子串

给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 这个有点像最长前缀匹配,简单的想到的就是暴力搜索一下,得到最大的子串,这样就是时间复杂度比较大,可以看到里面有两个f...

woshixin
44分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部