swift的基本语法

一 swift中的三大特性(重载;继承;多态)

1 继承

—-> 1.1 举个例子来说明 : 创建一个Person类,并且再创建一个老师和学生类,同时老师和学生类都继承Person类
//创建一个类
class Person {
    var name = ""
    var age = 0
    //函数
    func runing() {
        print("人在跑步")
    }
    func study() {
        print("人在学习")
    }
}
—-> 1.2 学生类 :
//继承
class Student : Person {
    var sno : Int = 0
    //重写父类的方法
    override func study() {
     print("学生在敲代码")
    }

    override init() {
        super.init(name: "", age: 20)
    }
}
—-> 1.3 继承于Person的老师类
class Teacher: Person {
    //重写: 子类对父类的方法不满意,重写进行实现
    override func study() {
        print("老师在备课")
    }
}
—-> 1.4 创建各自的对象并且调用方法
//创建对象
let stu = Student()
stu.sno = 110
stu.name = "xaiofeng"
stu.age = 19

stu.runing()
stu.study()

let tea = Teacher()
tea.study()

2 重载

—-> 2.1 重载条件 : 1> 参数的类型不同 2> 参数的个数不同 (满足其一就可以)
class MathTool {
    func sum(num1 : Int, num2 : Int) ->Int {
        return num1 + num2
    }
    func sum(num1 : Int, num2 : Int, num3 : Int) ->Int {
        return num1 + num2 + num3
    }
    func sum(num1 : Int, num2 : Int, num3 : Int, num4 : Int) ->Int {
        return num1 + num2 + num3 + num4
    }
}

let mathTool = MathTool()
—-> 2.2 解读重载 : 在OC中我们是不能定义完全相同的方法名,即使参数不同也是不能定义的,但是在swift中可以,但是必须满足条件,并且满足其一就可以.由上面的代码我们可以看出: 参数类型相同;函数名称相同;仅仅不同的是参数的个数,这也是满足条件的.

3 多态

—-> 3.1 条件 : 1> 一定有继承 2> 一定有方法的重写 3> 一定是父类的指针指向子类的对象
func studentInNight(p : Person) {
    p.study()
}
studentInNight(stu)
studentInNight(tea)

4 补充(重写)

—-> 4.1 重写原因 : 子类对父类方法不满意,不能实现需求,子类通过重写方法来实现
—-> 4.2 重写的关键字 : override(必须要在函数的前面加上这个关键字)
—-> 4.3 特殊例子 : 创建一个不继承NSObject的类,设计构造方法,不需要加上override关键字
class Person {
    var name = ""
    var age = 0
    //函数
    func runing() {
        print("人在跑步")
    }
    func study() {
        print("人在学习")
    }
    //如果该类继承了NSObject,那么就必须在init前面加上override,因为init是父类的方法,这样做事属于重写
    init() {
    }
    //设计构造方法
    init(name : String, age : Int) {
        self.name = name
        self.age = age
    }
}

二 swift中的循环引用

1 Swift和OC一样,采用自动引用计数来管理内容

—-> 1.1 当有一个强引用指向某一个动向时,该对象的引用计数会自动+1
—-> 1.2 当该强引用消失时,引用计数会自动-1
—-> 1.3 当引用计数为0时,该对象会被销毁
—-> 1.4 在通常情况下,ARC是会自动帮助我们管理内存的

2 简单循环引用实例 : 直接创建一个Person类

class Person {
    var name = ""
    deinit {
        print("Person-----deinit")
    }
}
//创建类对应的对象
var person : Person? = Person()
—-> 2.1 用图解析 不打印原因

—-> 2.2 解决这种原因 : 让person指向空

2 实例 : Person有一本书,书有一个主人(owner)

//定义两个类
class Person {
    var name = ""
//    person有一本书
    var book : Book?
    deinit {
        print("Person-----deinit")
    }
}

class Book {
    var price = 0.0
    //书有一个主人
    var owner : Person?
    deinit {
        print("Book -- deinit")
    }
}
//创建类对应的对象
var person : Person? = Person()
var book : Book? = Book()
—-> 2.1 deinit并不会打印出结果
—-> 2.2 循环引用示意图:

—-> 2.3 此时你会发现计算将person = nil;book = nil都指向空,都不能解决问题,如下示意图

—-> 2.4 解决问题 : 让互相指向的其中一个指针变成弱指针就可以

—-> 2.5 需要写入的代码(满足其中一个就可以)
weak var book : Book?
unowned var book : Book = Book()

三 swift中的可选链

1 可选链的概念

—-> 1.1 它的可选性体现于请求或调用的目标当前可能为空(nil)
—-> 1.1.1 如果可选的目标有值,那么调用就会成功;
—-> 1.1.2 如果选择的目标为空(nil),则这种调用将返回空(nil)
—-> 1.2 多次调用被链接在一起形成一个链,如果任何一个节点为空(nil)将导致整个链失效。

2 可选链的使用

—-> 2.1 在可选类型后面放一个问号,可以定义一个可选链。
—-> 2.2 这一点很像在可选值后面放一个叹号来强制拆得其封包内的值
—–> 2.2.1 它们的主要的区别在于当可选值为空时可选链即刻失败
—–> 2.2.2 然而一般的强制解析将会引发运行时错误。因为可选链的结果可能为nil,可能有值.因此它的返回值是一个可选类型.
—–> 2.2.3 可以通过判断返回是否有值来判断是否调用成功 : 1> 有值,说明调用成功 2> 为nil,说明调用失败

3 例子 : 人有一只狗,狗有一个玩具(toy),玩具有一个价格(price)

class Person {
    var name = ""
    var dog : Dog?
}

class Dog {
    var name = ""
    var toy : Toy?
}

class Toy {
    var price  : Double = 0.0 {
        didSet {
            print(price)
        }
    }

    //玩具有一个具体行为
    func rotating() {
        print("玩具在转圈")
    }
}
//创建对象
let person : Person = Person()
person.name = "xiaofeng"

let dog : Dog = Dog()
dog.name = "bigYellowDog"

let toy : Toy = Toy()
toy.price = 1.0

//让对象之间产生关系
person.dog = dog
dog.toy = toy
—-> 3.1 需求一 : 给玩具赋值一个新值
第一种方式 :
person.dog!.toy!.price = 50.0
解析一 : 该方法也是可以赋值的,但是比较危险,因为并不能确定dog!和toy!一定有值,如果强制解包,返回的是nil,就会造成程序崩溃
第二种方式 : (推荐使用可选链–>比较安全)
person.dog?.toy?.price = 50.0
解析二 : 1.每一个可选进行判断,判断是否有值,如果有其中一个没有值,那么整个表达式返回一个nil 2.如果所有的可选类型都有值,那么整个表达式返回对应的类型,就可以给类型进行赋值
3.2 需求二 : 取出狗对象玩具的价格
第一种方法 :
let price = person.dog!.toy!.price
解析一 : 该方法不安全,很有可能什么都去不到,返回一个nil,程序会崩溃
第二种方式 : (推荐使用可选链–>比较安全)
let price1 = person.dog?.toy?.price
print(price1)
解析二 : 1.判断所有的可选类型是否有值,如果有其中一个没有值,那么整个可选链返回一个nil 2.如果可选类型都有值,那么返回一个具体的值
3.3 需求三 : 调用方法
第一种 : (也是可以实现的,但是比较麻烦)
person.dog!.toy!.rotating()
if let dog = person.dog {
    if let toy = dog.toy {
        toy.rotating()
    }
}
第二种 : 一句代码搞定
person.dog?.toy?.rotating()
解析二 : 1.如果可选类型中有一个没有值,那么该方法就不会执行 2.反之,如果可选类型都有值,那么就会执行该方法

四 协议

1 协议的格式 : 协议的定义方式与类,结构体,枚举的定义都非常相似

protocol SomeProtocol {
    // 协议方法
}

2 遵守协议的格式

class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
    // 类的内容
    // 实现协议中的方法
}

3 协议的具体代码

—-> 3.1 定义协议
//定义协议
protocol CrazySportProtocol {
    func jumping()
    func jumpingSan()
}
—-> 3.2 协议之间的继承关系
//协议之间的继承
protocol SportProtool : CrazySportProtocol {
    func playBasketball()
    func playFootball()
}
—-> 3.3 准守协议和实现协议中的方法(默认遵守了协议,就必须实现协议中的方法)
//创建类遵守协议
class Person : SportProtool {
    //遵守了协议就必须实现协议中的方法
    func jumping() {
        print("蹦极")
    }
    func jumpingSan() {
        print("跳伞")
    }
    func playBasketball() {
        print("打篮球")
    }
    func playFootball() {
        print("踢足球")
    }
}
—-> 3.4 创建对象调用方法
//创建对象调用方法
var person = Person()
person.jumpingSan()
person.jumping()
person.playBasketball()
person.playFootball()
—-> 3.5 代理在协议中的实现
//定义协议
protocol BuyTicketDelegate : class {
    func buyTicketing()
}

//创建类
class Person {
    var name = ""
    //设置代理
    weak var delegate : BuyTicketDelegate?
    func goToBeiJing() {
        //使用代理调用对应的方法
//        delegate?.buyTicketing()
        print("坐火车去北京")
    }
}

//定义一个类,并且遵守协议
class YellowCattle : BuyTicketDelegate {
    //将人设置里面的属性
    var vipPerson : Person?
    //实现协议中的方法
    func buyTicketing() {
        print("黄牛帮你买了一张票")
    }
}

//创建对象
let person = Person()
person.name = "xiaofeng"

//创建黄牛对象
let huangniu = YellowCattle()
huangniu.vipPerson = person

//将黄牛设置为代理
person.delegate = huangniu
person.goToBeiJing()
—-> 3.6 协议方法的可选择性(在swift中是没有协议可选择实现的,但是我们可以通过oc的方法来达到可选择实现的目的)
//将上objc和optional就代表了可以选择的实现
@objc
protocol SportsProtocol {
   optional func jumping()
   optional func jumpingSan()
}

class Person1 : SportsProtocol {
    @objc func jumping() {
        print("蹦极")
    }
}
let p = Person1()
p.jumping()

五 闭包

1 闭包简介

—-> 1.1 闭包和OC中的block非常相似
—-> —–OC中的block是匿名的函数
—–>—–Swift中的闭包是一个特殊的函数
—–>—–block和闭包都经常用于回调

2 block的使用

—-> 2.1 block的用法回顾
定义网络请求类 :
@interface HttpTool : NSObject
- (void)loadRequest:(void (^)())callBackBlock;
@end

@implementation HttpTool
- (void)loadRequest:(void (^)())callBackBlock
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"加载网络数据:%@", [NSThread currentThread]);

        dispatch_async(dispatch_get_main_queue(), ^{
            callBackBlock();
        });
    });
}
@end
进行网络请求,请求到数据后利用block进行回调
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.httpTool loadRequest:^{
        NSLog(@"主线程中,将数据回调.%@", [NSThread currentThread]);
    }];
}
block写法总结:
block的写法:
    类型:
    返回值(^block的名称)(block的参数)

    值:
    ^(参数列表) {
        // 执行的代码
    };

3 闭包代替block使用

定义网络请求的类
class HttpTool: NSObject {
    func loadRequest(callBack : ()->()){
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("加载数据", [NSThread.currentThread()])

             dispatch_async(dispatch_get_main_queue(), { () -> Void in
                callBack()
             })
        }
    }
}
进行网络请求,请求到数据后利用闭包进行回调
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        // 网络请求
        httpTool.loadRequest ({ () -> () in
            print("回到主线程", NSThread.currentThread());
        })
    }
闭包写法总结:
闭包的写法:
    类型:(形参列表)->(返回值)
    技巧:初学者定义闭包类型,直接写()->().再填充参数和返回值

    值:
    {
        (形参) -> 返回值类型 in
        // 执行代码
    }

4 闭包的简写

—-> 4.1 如果闭包没有参数,没有返回值.in和in之前的内容可以省略
httpTool.loadRequest({
        print("回到主线程", NSThread.currentThread());
    })
—-> 4.2 尾随闭包写法:如果闭包是函数的最后一个参数,则可以将闭包写在()后面;如果函数只有一个参数,并且这个参数是闭包,那么()可以不写
httpTool.loadRequest() {
        print("回到主线程", NSThread.currentThread());
    }
// 开发中建议该写法
httpTool.loadRequest {
        print("回到主线程", NSThread.currentThread());
    }

六 懒加载

1 OC中有懒加载,而在swift中也存在懒加载.苹果希望我们对所有的对象只有在使用的时候才真在的加到内存中,这样能大大的减少了内存的消耗.

2 懒加载格式

lazy var 变量: 类型 = { 创建变量代码 }()

3 具体实例

—-> 3.1 懒加载写法一:(不推荐)
lazy var names : [String] = {
        return ["xiaofeng", "it", "nb"]
    }()

    lazy var btn : UIButton = {
        let tempBtn = UIButton()
        tempBtn.setTitle("按钮", forState: .Normal)

        return tempBtn
    }()
—-> 3.2 懒加载写法二 : (推荐)
lazy var button : UIButton = UIButton()

七 访问权限(下面只介绍概念)

1 private : 只能在当前文件中访问,不能在其他文件中访问

2 internal : 内部的,修饰整个项目,在整个项目中都可以进行访问,并且默认情况下修饰就是internal

3 public : 是可以跨框架访问

八 异常处理

1 try : 手动处理异常,并且获取在调用方法过程中到底产生了怎么样的异常

2 try? : 自己不处理异常,让系统帮助我们处理

系统如何处理:

—-> 2.1 如果该方法产生了异常,那么系统会将该方法的返回值为nil
—-> 2.2 如果该方法没有产生异常,那么系统会返回对应的类型结果

3 try! : 告诉系统这个方法不会产生异常 –> 注意:如果该方法产生了异常,那么程序会崩溃(不推荐)

九 oc和swift之间混编(给上具体步骤,这里就不简要说明了)

1 swift中调用OC代码

—-> 1.1 创建一个swift文件
—-> 1.2 在swift文件中创建一个oc类(点击don’t bridge)
—-> 1.3 创建一个桥接文件(仅仅是一个头文件)
—-> 1.4 配置 点击工程文件–> Bulid Setting –>brid –>双击objc填入bridge的文件路径

2 OC中调用swift代码

—-> 2.1 创建一个OC项目(标题不能写”_”,或者其他符号,使用全英文)
—-> 2.2 创建一个swift文件(点击don’t bridge)
—-> 2.3 导入一个头文件(项目名称 -swift.h)
—-> 2.4 swift都需要使用public修饰(方法/属性)

十 总结

1 swift语法基本已经介绍的差不多了,其中还有不足,一时间没有想到,希望看到我博客的人给点意见,让我知道还有那些没有介绍.明天给大家带来一个小小的demo.(纯swift代码实现)

2 最后大家如果觉得我写大博客还行,麻烦大家给点意见,好的坏的我都接受,麻烦大家关注我的官方博客,谢谢!!!!

时间: 2024-10-09 02:29:00

swift的基本语法的相关文章

Swift基础:创建第一个Swift工程:Swift的基本语法

苹果公司在今年的WWDC大会上,除了发布了iOS8和Max OS X 10.10之外,还发布了一个新的编程语言Swift.不得不说,Swift有较大的转变,也使编程变得更加容易了,下面介绍了Swift的常量和变量的定义,基本控制语句的使用: 需要注意的是:Swift只能在Xcode 6 Beta版中运行,Xcode 6 目前最新的是Beta 7,大家可以通过以下链接下载: http://adcdownload.apple.com//Developer_Tools/xcode_6_beta_7_a

swift笔记1-点语法

? 1 2 3 4 5 6 var firstForLoop = 0 for i in 0...3 {     firstForLoop += i     i } firstForLoop 1 两个点代表是左闭右开 即0,1,2 2 三个点代表全集合 即0,1,2,3 ? 1 2 3 4 5 6 7 func sumOf(numbers: Int...) -> Int {     var sum = 0     for number in numbers {         sum += num

Swift初窥----语法

Swift知识点 下面来点实际写Swift代码要用到的,首先Swift是没有头文件的,没有.h文件. 变量声明 Swift的变量声明有两个关键字,var和let,其中var和javascript中的差不多,可以声明任何类型的对象,还可以通过var mystring:String 来指定类型. var myVariable = 42 myVariable = 50 let myConstant = 42 函数 Swift的函数表达,与javascript的关键字是一样的,都是func,然后接函数名

swiftDay01笔记 --swift和OC的不同点 &amp;&amp; swift的基础语法

1.创建对象 带圆括号 * OC:      alloc initWithXXX 方法 * Swift:   (xxx:) //OC : //UIView *view = [UIView alloc]init]; //Swift : let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 2.方法调用   用点 * OC:     [UIColor redColor]; * Swift    UIColor.re

swift 2.0 语法 可选类型

import UIKit /*: 可选类型(可以有值, 也可以没有值) * 在OC中我们可以给一个对象类型变量赋值为nil或者一个对象, 而在Swift中如果想给一个变量赋值为nil那么必须明确指定为可选类型才可以, 也就是说普通变量是不能赋值为nil的 格式:  数据类型? *  以后但凡看到init后面跟上一个?, 就代表初始化方法返回的值是可选的 注意: * 可选类型是不能直接使用的, 如果向使用一个可选类型的值, 必须对可选类型进行解包 ! * 解包的含义: 告诉系统可选类型的变量, 一

利用Swift之协议语法实现页面间的传值功能

随着Swift 新开发语言的发布,又随着Xcode6.0.1的正式发布,利用swift编写iOS代码迫在眉睫,笔者在使用Objective-C开发近三年以来,对这种优雅的语法深感赞叹,下面我将对比式的实现一个页面传值的demo,使用语法是swift,页面传值是学习iOS初期必修的demo,因为涉及一个非常难懂的语法:协议和委托,这里涉及的swift语法和一些基本操作我不在一一赘述,如果方便可下载IT面试宝典APP,里面有对其详细介绍,那就开门见山吧,用代码实现以下功能: 1,创建Swift工程,

Swift之函数语法详解

函数(Functions) 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被“调用”. Swift 统一的函数语法足够灵活,可以用来表示任何函数,包括从最简单的没有参数名字的 C 风格函数,到复杂的带局部和外部参数名的 Objective-C 风格函数.参数可以提供默认值,以简化函数调用.参数也可以既当做传入参数,也当做传出参数,也就是说,一旦函数执行结束,传入的参数值可以被修改. 在 Swift 中,每个函数都有一种

swift 2.2 语法 (上)

前言: 1.swift2.2 语法(下)正在整理中,预计5.17号完成. 2.此文中的语法会根据swift的升级变动而更新. Swift与OC中常见的区别 导入框架 OC: #import <UIKit> #import "AFNetWorking.h" Swift: import UIKit 定义标识符 OC: int i = 0; Swift: // 不可变标识符 let i = 0 或 let i : Int = 0 // 可变标识符 var i = 0 或 var

iOS开发——swift篇&amp;经典语法(八)初始化

初始化 初始化是类,结构体和枚举类型实例化的准备阶段.这个阶段设置这个实例存储的属性的初始化数值和做一些使用实例之前的准备以及必须要做的其他一些设置工作. 通过定义构造器(initializers)实现这个实例化过程,也就是创建一个新的具体实例的特殊方法.和Objective-C不一样的是,Swift的构造器没有返回值.它们主要充当的角色是确保这个实例在使用之前能正确的初始化. 类实例也能实现一个析构器(deinitializer),在类实例销毁之前做一些清理工作.更多的关于析构器(deinit