空值合并运算符和区间运算符
今天主要看的内容是 Swift 中的基本运算符。记录一下。
Nil Coalescing Operator
a ?? b 中的 ?? 就是是空值合并运算符,会对 a 进行判断,如果不为 nil 则解包,否则就返回 b 。
var a: String? = "a" var b: String? = "b" var c = a ?? b // "a" a = nil c = a ?? b // "b" b = nil c = a ?? b ?? "c" // "c"
使用的时候有以下两点要求:
a 必须是 optional 的
b 必须和 a 类型一致
也就是说,a 一定要有被备胎的可能,b 一定要有做备胎的资格。
其实也就是对三目运算符的简写:
a != nil ? a! : b 或者 a == nil ? b : a!
当然你也可以通过自定义运算符来实现:
infix operator ||| {} func |||<T> (left: T?, right: T) -> T { if let l = left { return l } return right } var a:String? var b = "b" var c = a ||| b
C# 中也有个 ?? ,感兴趣的可以去了解一下。
Range Operator
区间运算符分为闭区间 (...) 和左闭右开区间 (..<) 两种,前者是算头算尾,后者是算头不算尾。
可以应用在 switch 中:
switch aNumber { case 0...5: println("This number is between 0 and 5") case 6...10: println("This number is between 6 and 10") default: println("This number is not between 0 and 10") }
区间运算符其实返回的是一个 Range<T> 对象,是一个连续无关联序列索引的集合。
话说以前左闭右开是 .. ,这样和 Ruby 的就刚好完全相反了。。。
不过有人就是想用 .. ,那么可以这样自己写一个:
infix operator .. { associativity none precedence 135} func .. (lhs: Int, rhs: Int) -> Range<Int> { return lhs..<rhs } for i in 0..10 { println("index \(i)") }
你也可以用 generate() 来遍历:
var range = 1...4 var generator = range.generate() // {startIndex 1, endIndex 5} generator.next() // 1 generator.next() // 2 generator.next() // 3 generator.next() // 4 generator.next() // nil
.generate() 返回一个 RangeGenerator<T> 的结构体,可以用来遍历 Range<T> 中的值。
以前还有个 (5...1).by(-1) 的用法,不过现在好像没用了。
区间运算符返回的是一个 ClosedInterval 或者 HalfOpenInterval 的东西,类型只要是 Comparable 就可以了。所以我们也可以把 String 放到 ... 里。
比如猫神的 Swifter Tips 中有一章的代码如下,通过 String 的 ClosedInterval 来输出字符串中的小写字母:
let test = "Hello" let interval = "a"..."z" for c in test { if interval.contains(String(c)) { println("\(c)") } }
SubString
Ruby 中用点点点来获取 SubString 的方法很方便:
2.1.3 :001 > a="abc" => "abc" 2.1.3 :002 > a[0] => "a" 2.1.3 :003 > a[0..1] => "ab"
而 Swift 中的 ClosedInterval 是没有 subscript 的。但是任性的我们就是要用 [1...3] 这种方法怎么办呢?
自己动手丰衣足食,写个 extension 吧,只需要加个 subscript 就可以了,然后下标的类型是 Range<Int> 就可以了:
extension String { subscript (r: Range<Int>) -> String { get { let startIndex = advance(self.startIndex, r.startIndex) let endIndex = advance(startIndex, r.endIndex - r.startIndex) return self[Range(start: startIndex, end: endIndex)] } } } var s = "Hello, playground" println(s[0...5]) // ==> "Hello," println(s[0..<5]) // ==> "Hello"
如果要搜索目标字符串之后再截取 substring 可以这样:
let name = "Joris Kluivers" let start = name.startIndex let end = find(name, " ") if (end != nil) { let firstName = name[start..<end!] } else { // no space found }
以上所述就是本文的全部内容了,希望大家能够喜欢。
本文向大家介绍Swift学习笔记之元组(tuples),包括了Swift学习笔记之元组(tuples)的使用技巧和注意事项,需要的朋友参考一下 元组 元组(tuples)是由其它类型组合而成的类型。元组可能包含零或多个类型,比如 字符串、整数、字符、布尔以及其它元组。同时请注意,元组是值传递,而不是引用。 在Swift中创建元组的方式很简单,元组类型是用括号包围,由一个逗号分隔的零个或多个类型的列
本文向大家介绍Web前端新人笔记之jquery入门心得(新手必看),包括了Web前端新人笔记之jquery入门心得(新手必看)的使用技巧和注意事项,需要的朋友参考一下 本章将为大家介绍以下几点内容; 1、jquery的主要特点; 2、建立jquery的编码环境; 3、简单jquery脚本示例; 4、选择jquery而不是纯javaScript的理由; 5、常用的jquery开发工具;jquery能
本文向大家介绍PHP读书笔记_运算符详解,包括了PHP读书笔记_运算符详解的使用技巧和注意事项,需要的朋友参考一下 什么是运算符 什么是运算符?运算符是告诉PHP做相关运算的标识符号。例如,你需要计算123乘以456等于多少,这时候就需要一个符号,告诉服务器,你需要做乘法运算。 PHP中的运算符有哪些?PHP运算符一般分为算术运算符、赋值运算符、比较运算符、三元运算符、逻辑运算符、字符串连接运算符
本文向大家介绍Swift学习笔记之构造器重载,包括了Swift学习笔记之构造器重载的使用技巧和注意事项,需要的朋友参考一下 与函数一样,方法也存在重载,其重载的方式与函数一致。那么作为构造器的特殊方法,是否也存在重载呢?答案是肯定的。 一、构造器重载概念 Swift中函数重载的条件也适用于构造器,条件如下: 函数有相同的名字; 参数列表不同或返回值类型不同,或外部参数名不同; Swift中的构造器
主要内容:1. 算术运算符,2.比较运算符,3.逻辑运算符,4.按位运算符,4.分配运算符,5.范围运算符,6.其它运算符,7.运算符优先级运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。 Swift内置运算符丰富,它提供以下类型的运算符 - 算术运算符 比较运算符 逻辑运算符 按位运算符 分配运算符 范围运算符 杂项运算符 本教程将逐一解释算术,关系,逻辑,按位,赋值和其他运算符。 1. 算术运算符 下表显示了Swift 4语言支持的所有算术运算符。 假设变量,变量,则 - 运算符 描述
运算符是一个符号,用于告诉编译器执行一个数学或逻辑运算。 Swift 提供了以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 赋值运算符 区间运算符 其他运算符 本章节我们将为大家详细介绍算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符及其他运算符。 算术运算符 以下表格列出了 Swift 语言支持的算术运算符,其中变量 A 为 10,变量 B 为 20: 运算符 描述 实例