Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)

本篇分三部分:

一、Struct Mutable方法

二、多元组(Tuple) 的使用

三、autoclosure 的使用

四、Optional Chain 的使用



一、Struct Mutable方法

直接上代码:

struct User {
    var weight: Int
    var height: Int

    // 这里会报错 Left side of mutating operator isn‘t mutable:‘self‘ is immutable
    // 因为 Struct 出来的变量是 immutable 的,想要用一个方法去改变变量里面的值的时候必须要加上一个关键字 mutating
    mutating func gainWeight(newWeight: Int) {
        weight += newWeight
    }
}
var newUser = User(weight: 117, height: 178)
newUser.gainWeight(10)

运行结果: 



二、多元组(Tuple)

  多元组是 Swift 的新特性,普通程序员都是定义一个临时变量来保存需要交换的值得,现在我们可以不使用额外空间而使用多元组特性直接交换 a 和 b 的值

func swapMe<T>(inout a: T, inout b: T) {
    (a, b) = (b, a)
}
var a = 5, b = 6
swapMe(&a, b: &b)
print(a, b)  // 输出结果为6 5


三、autoclosure的 基本使用

// 在不使用autoclosure的情况下
func logIfTrue(predicate: () -> Bool) {
    if predicate() {
        print("True")
    }
}
// 第一种调用方式
logIfTrue { () -> Bool in
    return true
}
// 第二种调用方式
logIfTrue({return 2 > 1})
// 第三种调用方式
logIfTrue({2 > 1})
// 第四种调用方式
logIfTrue{2 > 1}

// 使用autoclosure
func logIfTrue(@autoclosure predicate: () -> Bool) {
    if predicate() {
        print("True")
    } else {
        print("False")
    }
}
// 调用方式
logIfTrue(2 > 1)
logIfTrue(1 > 2)

四、Optional Chain 的使用

class Toy {
    let name: String
    init(name: String) {
        self.name = name
    }
}

class Pet {
    var toy: Toy?
}

class Child {
    var pet: Pet?
}

let toy: Toy = Toy(name: "")
let pet: Pet = Pet()
let xiaoming: Child = Child()

  在这里最后访问的是 name,并且在 Toy 的定义中 name 是被定义为一个确定的 String 而非 String? 的,但是我们拿到的 toyName 其实还是一个 String?的类型。这是由于在 Optional Chaining 中我们在任意一个 ? 的时候都可能遇到 nil 而提前返回,这个时候当然就只能拿到 nil 了

let toyName = xiaoming.pet?.toy?.name
// 所以在实际开发中,我们通常使用 Optional Binding 来直接取值:
if let toyName = xiaoming.pet?.toy?.name {
    // 这时toyName 就是 String 而非 String? 了
}

extension Toy {
    func play() {
        print("玩玩具~~")
    }
}

let playClosure = {(child: Child) -> () in
    child.pet?.toy?.play()
}
时间: 2024-08-12 12:17:23

Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)的相关文章

QT开发(五十四)———QML组件

QT开发(五十四)---QML组件 QML组件是由基本元素组合成的一个复杂的可重用的组合元素.QML 提供了多种方法来创建组件. 基于文件的组件将QML元素放置在一个单独的文件中,然后给文件一个名字,可以通过名字来使用组件.如果有一个文件名为Cell.qml,就可以在QML中使用Cell { - }形式.自定义组件的文件名的首字母必须大写. Cell.qml文件: import QtQuick 2.0   Item {     id: container     property alias c

API开发第五篇:服务端整合支付宝快捷移动支付接口

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre"> </span>在开发中需要使用支付宝的快捷移动支付接口,通过文档知道,当完成客户端请求完成后,支付宝服务器会异步通知客户端的服务器.这里的关键是提供给支付宝的这个用于异步通知的con

Swift开发第六篇——操作运算符也可以重载&amp; func 的参数修饰

本篇分为两部分: 1.Swift 中重载操作运算符的使用 2.Swfit 中 func 的参数修饰 1.Swift 中重载操作运算符的使用 与别的语言不同,Swift 支持运算符的重载,运算符指的是“+,-,%,*”等操作运算符,从而使一些操作更加简便. 在开发中,我们对于一些基本运算通常是这样写的: struct Vector2D { var x = 0.0 var y = 0.0 } let v1 = Vector2D(x: 2, y: 3) let v2 = Vector2D(x: 1,

Swift开发第八篇——方法嵌套&amp;命名空间

本篇分为两部分: 一.Swift中的方法嵌套 二.Swift中的命名空间 一.Swift中的方法嵌套 在 swift 中我们可以让方法嵌套方法,如: func appendQuery(var url: String, key: String, value: AnyObject) -> String { func appendQueryDictionary(url: String, key: String, value: [String: AnyObject]) -> String { //..

微信开发第五篇手机端微信公众号自定义菜单及OAuth2.0授权页面

说到自定义菜单,首先要想到调用微信的接口,其实微信公众号开发本身就是看对不对微信公众号接口的熟悉程度,我也是在项目中才开始接触微信公众号开发的,很感谢公司能给我这个项目机会.其实对于一个程序员来说最宝贵的是他的学习能力,而不是经验,不扯没用的了. 菜单上一篇讲到了怎么查看微信开发文档,那么很容易找到自定义菜单管理,根据里面的内容可以做一下思路 手机微信客户端与微信服务器交互,再由微信服务器与咱们自己的服务器交互,在第一次交互时先删除原始的那种可以打字的那种菜单,之后设置自己新的菜单,最后把自己的

软件工程迭代开发第五篇

今天开始同组员一起开发技能方面的内容,但还未出成果,所以内容较少. 修改了一个小小的bug,关于新建账号出生的人物经验不对的bug. 这是人物初始化函数(构造函数),exp代表经验,一开始写成了exp=maxexp,所以经验有问题. Player::Player() :tj(1.6,0.2, mapmax / 40.0, mapmax / 20.0){ wx = 1.6; wy = 0.2; movenum = 0; setlv(1); hp = maxhp; exp = 0; fightran

Direct2D 1.1 开发笔记 特效篇(四) 图形调试

 (转载请注明出处) 如同上节所述,这节讲讲怎么调试图形. 很可惜,微软并没有对VS Express 2013 for Windows Desktop(下面简称WDExpress)添加图形调试功能. 对于付费版的VS(VS2013 pro对于学生与教员可以免费获取)则带有图形调试功能: 调试--图形--启用诊断 即可. 对于免费版,则有VS Express 2013 for Windows(下面简称VSWinExpress)带有图形调试功能. 幸运地,一个付费版.WDExpress与VSWi

基于GBT28181:SIP协议组件开发-----------第五篇SIP注册流程eXosip2实现(二)

原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3966794.html. 上章节讲解了讲解一个用eXosip2库实现的Demo 程序.Demo讲的是注册的过程,因为篇幅比较长,再分一节写.本节是上一节的继续,主要实现UAC用eXosip2库实现的Demo 程序.本节讲的比较全面,处理实现注册问题还添加了注销和刷新注册的过程.刷新相当于心跳的功能.注意这个函数eXosip_default_action()实现在si

基于hi-nginx的web开发(python篇)——动态路由和请求方法

hi.py的提供的路由装饰器接受两个参数,第一个参数指定动态路由的正则模式,第二个参数指定同意的http请求方法列表. 比如: 1 @app.route(r"^/client/?$",['GET','POST']) 2 def client(req,res,param): 3 res.content('{}<br>{}<br>{}<br>{}<br>{}'.format(req.client(),req.method(),req.uri(