下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 17 | 赋值和算术运算符
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Swift核心技术与实战

共120讲 · 约1000分钟
1459
免费
01 | 课程介绍
免费
02 | 内容综述
免费
03 | Swift版本历史和各版本特...
免费
04 | Swift和Objective-C的主...
免费
05 | swiftc:强大的命令行工具
06 | REPL:Swift交互式解释器
07 | Playground:Swift学习的...
08 | 如何在Swift中定义常量和...
09 | Swift中的数值类型
10 | 如何使用Tuple组合多个值
11 | 如何在Swift中使用Optiona...
12 | Optional实现原理探究
13 | 如何在Swift中创建和初始...
14 | Swift字符串的常见操作
15 | 如何使用索引访问和修改字...
16 | 如何在Swift中获取子串和...
17 | 赋值和算术运算符
18 | 在Swift里如何处理算术结...
19 | 为了Optional:合并空置运...
20 | Swift的新宠:区间运算符
21 | 强大的位运算符
22 | 位运算符应用举例(1)
23 | 位运算符应用举例(2)
24 | 运算符优先级和结合性
25 | 如何为类和结构体自定义运...
26 | 如在Swift中定义自己的运...
27 | 如何在Swift里进行循环控...
28 | 更加强大的switch
29 | 如何在Swift里进行控制转...
30 | 如何使用guard来改善你的...
31 | Swift中的模式和模式匹配
32 | 在Swift中创建数组的N种方...
33 | 访问和操作数组:遍历和索...
34 | 访问和操作数组:查找操作
35 | 访问和操作数组:添加和删...
36 | 访问和操作数组:ArraySl...
37 | 访问和操作数组:重排操作
38丨访问和操作数组:拼接操作
39丨深入理解数组:底层实现探究
40丨如何用数组来实现栈和队列
41丨Set:定义和创建
42丨Set:访问和修改
43丨Set:执行Set计算和判断
44 | 实现自己的集合算法
45 | 深入理解集合:底层实现探...
46 | Dictionary:Swift中的字...
47 | 字典的常见操作
48 | 深入理解字典:底层实现探...
49 | Swift 中如何定义和使用...
50 | 函数的形式参数和返回值
51 | 函数类型和内嵌函数
52 | 闭包和闭包表达式
53 | 闭包捕获值
54 | 逃逸闭包和自动闭包
55 | 如何使用Swift中的高阶函...
56 | 函数式编程(1)
57 | 函数式编程(2)
58 | Swift面向对象概述
59 | 枚举从此站起来了
60 | 如何为类、结构体以及枚举...
61 | 如何为类、结构体以及枚举...
62 | 像访问数组和字典一样访问...
63 | 如何进行类的初始化和反初...
64 | 如何在Swift中实现继承
65 | 如何在Swift中实现多态和...
66 | 如何为现有的类、结构体、...
67丨Swift中的协议
68丨协议和扩展
69丨面向协议编程初探(1)
70丨面向协议编程初探(2)
71丨泛型的发展历史与泛型的概述
72丨如何在Swift中定义泛型函数
73丨如何在Swift中定义泛型类型
74丨Swift泛型中的类型约束
75 | 为了协议:关联类型
76 | 如何为泛型定义要求:wher...
77 | 泛型下标
78丨泛型编程思想浅谈
79 | 如何在Swift中创建一个线...
80 | 更高级的抽象:Cocoa Ope...
81丨多线程编程新思路:GCD概览
82 | 如何使用GCD:基本操作指...
83 | 深度使用GCD:高级特性指...
84 | 深入理解GCD:源码剖析
85 | 如何保证线程安全和同步
86 | 实践出真知:多线程典型应...
87 | 拓宽思路:其他常见的多线...
88 | SwiftUI:Apple全新的UI框...
89 | SwiftUI设计工具使用指南
90 | 如何使用SwiftUI构建可复...
91 | 如何用SwiftUI实现动画
92 | 深入理解SwiftUI:实现原...
93 | 如何在Swift里进行错误处...
94 | Swift中代码访问权限控制
95 | 不透明类型
96 | Swift中的自动引用计数
97 | Swift中的内存安全性
98 | 如何在项目中进行网络请求
99 | 如何进行JSON的序列化和反...
100 | 没有最方便,只有更方便...
101 | 如何在Swift中进行自动布...
102 | 如何进行图片加载和缓存
103 | 以一种优雅安全的方式使...
104 | 如在项目中将内容分享到...
105 | Swift和Objective-C的运...
106 | 桥接问题
107 | 如何在Swift和Objective...
108 | Swift和Objective-C混合...
109 | 如何搭建一个iOS Swift...
110 | 商城整体架构、UI设计和...
111 | 编写mock API
112 | 登录注册页模块开发
113 | 商城列表页模块开发
114 | 商城详情页模块开发
115 | 商城个人中心页模块开发
116 | 商城订单页模块开发
117 | 结束语
118|加餐1:可选链
119|加餐2:Swift KVC
120|加餐3:Swift面试中的要点注...

精选留言(3)

  • 2019-08-29
    老师生病了呀,保重身体
    3
  • 不好意思,前几天学所有权在消化做笔记。今天把这段代码分享给老师和大家,代码来源于互联网,注释为本人注释,如有不对的地方请大家指正,。
    prefix operator +☀
    infix operator +-☀ : PlusMinusPrecedence

    precedencegroup PlusMinusPrecedence {
        associativity: none // 结合性(left\right\none)
        higherThan: AdditionPrecedence //比谁的优先级高
        lowerThan: MultiplicationPrecedence//比谁的优先级低,不能是该模块内部的
        assignment: false //如果设置成true,那么遇到可选链的时候该操作符就相当于赋值操作符。否则false就不执行赋值操作。
    }


    struct Point {
        var x: Int, y: Int
        static prefix func +☀(point: inout Point) -> Point {
            point = Point(x: point.x + point.x, y: point.y + point.y)
            return point
        }
        static func +-☀(left: Point,right: Point) -> Point {
            return Point(x: left.x + right.x, y: left.y - right.y)
        }
        static func +-☀(left: Point?,right: Point) -> Point {
            print("+-☀")
            return Point(x: left?.x ?? 0 + right.x, y: left?.y ?? 0 - right.y)
        }
    }

    struct Person {
        var point: Point //= Point(x: 10, y: 20)
    }
    var person: Person? //= Person.init()
    person?.point +-☀ Point(x: 10, y: 20)//(Point(x: 10, y: 20) +-☀ Point(x: 10, y: 20))
    print(person?.point as Any)
    var test = Point(x: 10, y: 20)
    Point(x: 10, y: 20) +-☀ (+☀test)
    展开

    作者回复: 我把你的例子改了一下,既然是赋值运算,你的实现里明显不是。

    infix operator +-☀ : PlusMinusPrecedence

    precedencegroup PlusMinusPrecedence {
        associativity: none
        higherThan: AdditionPrecedence
        lowerThan: MultiplicationPrecedence
        assignment: true
    }

    struct Point {
        var x: Int, y: Int
        static func +-☀(left: inout Point, right: Point) {
            left = Point(x: left.x + right.x, y: left.y - right.y)
        }
    }

    struct Person {
        var point: Point
    }
    var person: Person?
    person?.point +-☀ Point(x: 10, y: 20)
    print(person?.point as Any)

    你可以尝试把assignment的true改成false,是会报错的,所以assignment的可选链里的作用如下:

    “This proposal quietly drops the assignment modifier that exists on operators today. This modifier had one important function–an operator marked assignment gets folded into an optional chain, allowing foo?.bar += 2 to work as foo?(.bar += 2) instead of failing to type-check as (foo?.bar) += 2. In practice, all Swift operators currently marked assignment are at the equivalent of the Assignment precedence level, so the core team recommends making this optional chaining interaction a special feature of the Assignment precedence group.”

    1
  • 高级运算符文档中,在定义优先级组的时候有个布尔值的属性assignment,设置true的时候有什么讲究。看了人家写的代码可选链为空的时候做赋值运算返回nil,而不是中缀运算了。可以看出这个中缀自定义的运算符相当于赋值运算符了,并不会调用左边形式参数为可选类型的自定义运算。

    作者回复: assignment只是表明是否是赋值,你这个有代码么,拿出来看一下

    1