swift 可选值详解3

128 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

自定义运算符

开发者可以自定义不存在的运算符来实现特殊的需求。
自定义运算符分为两个步骤,首先开发者需要对要定义的运算符进行声明。在声明运算符的结构中,prefix的作用是声明运算符的类型,可以使用prefix关键字将其声明为前缀运算符,使用infix关键字将其声明为中缀运算符,使用postfix关键字将其声明为后运算符。
在进行运算符的实现时,后缀和前缀运算符只能有一个参数,参数在
func
关键字前需要表明要实现的运算符类型,而中缀运算符需要有两个参数且func关键字前不需要额外标明,示例如下:

///自定义前缀运算符
prefix operator ++

///进行自定义运算符实现
prefix func ++(num: Int) -> Int {
    return num + 1
}

var a = ++5
///将返回6
print(a)
///自定义中缀运算符
infix operator ++

func ++(num1: Int, num2: Int) -> Int {
    return num1 * num1 + num2 * num2
}
var b = 5 ++ 4
///将返回41
print(b)
///自定义后缀运算符
postfix operator ++

postfix func ++(num: Int) -> Int {
    return num + num
}

var c = 5++
///将返回10
print(c)

提示
前缀运算符是指只有一个操作数且在使用运算符进行运算时,运算符需要出现在操作数的前面;
中缀运算符需要有两个操作数,且在进行运算时运算符需要出现在两个操作数的中间;
后缀运算符只能有一个操作数,在运算时后缀运算符需要出现在操作数的后面。

运算符的优先级与结合性

任何运算符都有默认的优先级,开发者自定义的运算符也是如此,优先级越高的运算符越优先执行。对于结合性而言,由于前缀运算符与后缀运算符都只有一个操作数,因此它只对中缀运算符有意义。
在重载运算符操作中,并不会改变原运算符的结合性和优先级,但对于自定义运算符,开发者可以设置其结合性与优先级,示例如下:

precedencegroup customGroup {
    higherThan: AdditionPrecedence///优先级比加法运算符的优先级高
    lowerThan: MultiplicationPrecedence///优先级比乘法运算符的优先级低
    assignment: true///设置执行可选链操作时的优先级
    associativity: left///定义结合性
}
///定义中缀运算符,其属性由customGroup描述
infix operator +++: customGroup

当系统内置的优先级组不能满足我们的要求时,即可使用**precedencegroup**关键字来自定义优先级组。

隐式解析可选类型

隐式解析可选类型是可选类型的一种,使用的过程中和非可选类型无异。它们之间唯一的区别是,隐式解析可选类型是你告诉Swift 编译器,我在运行时访问时,值不会为 nil。

var age: Int?
var age1: Int!
age = nil
age1 = nil

image.png 其实日常开发中我们比较常见这种隐士解析可选类型。

image.png IBOutlet类型是Xcode强制为可选类型的,因为它不是在初始化时赋值的,而是在加载视图的时候。你可以把它设置为普通可选类型,但是如果这个视图加载正确,它是不会为空的。