Swift心得笔记之运算符_Swift

空值合并运算符和区间运算符

今天主要看的内容是 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
运算符
swift 运算符、swift三目运算符、swift三元运算符、swift运算符重载、swift3.0 三目运算符,以便于您获取更多的相关知识。

时间: 2024-09-21 11:22:35

Swift心得笔记之运算符_Swift的相关文章

Swift心得笔记之控制流_Swift

控制流基本上大同小异,在此列举几个比较有趣的地方. switch Break 文档原文是 No Implicit Fallthrough ,粗暴的翻译一下就是:不存在隐式贯穿.其中 Implicit 是一个经常出现的词,中文原意是:"含蓄的,暗示的,隐蓄的".在 Swift 中通常表示默认处理.比如这里的隐式贯穿,就是指传统的多个 case 如果没有 break 就会从上穿到底的情况.再例如 implicitly unwrapped optionals ,隐式解析可选类型,则是默认会进

Swift心得笔记之函数_Swift

参数 外部变量名 一般情况下你可以不指定外部变量名,直接调用函数: 复制代码 代码如下: func helloWithName(name: String, age: Int, location: String) {     println("Hello \(name). I live in \(location) too. When is your \(age + 1)th birthday?") } helloWithName("Mr. Roboto", 5, &

Swift心得笔记之字符串_Swift

字符串 简介 String 中的字符串是值类型,传递的时候会对值进行拷贝,而 NSString 的字符串传递则是引用.我们可以用 for in 遍历字符串: 复制代码 代码如下: var a : String = "a" for c in "Hello" {     println(c) } 可以通过 countElements 计算字符串的字符数量: 复制代码 代码如下: countElements("1234567") // 7 不过要注意的

Swift心得笔记之集合类型_Swift

数组 重复值的初始化 除了普通的初始化方法,我们可以通过 init(count: Int, repeatedValue: T) 来初始化一个数组并填充上重复的值: 复制代码 代码如下: // [0.0,0.0,0.0] var threeDoubles = [Double](count:3,repeatedValue:0.0) 带索引值的遍历 我们可以用 for in 遍历数组,如果想要 index 的话,可以用 enumerate<Seq : SequenceType>(base: Seq)

Swift语言指南(九) Swift语言的基本运算符

运算符(operator)是用来检查,改变或合并值的一种特殊符号或短语.例如,加号运算符让两个数字相加(如:let i = 1 + 2),还有些更复杂的运算符,如逻辑与运算符(&&)(如:if enteredDoorCode && passedRetinaScan)和自增运算符(++i)(将 i 的值加 1 的便捷写法). Swift 支持标准C语言的大多数运算符,并且改进了一些特性以规避常见的代码错误.赋值运算符(=)是没有返回值的,这样是为了避免在使用等于运算符(==)

Swift学习笔记(一)搭配环境以及代码运行成功

原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹果以后大力推广的语言哦!   2.Swift给你带来什么机会? 当初你觉得objc太难,学ios学到一半放弃拉,或者进入it行业大家都搞android,你也搞android去了.现在你终于有机会和搞ios的站在一个语言的起跑线上,兄弟!swift传说很容易学哦,搞android的你想不想增加一下本领

Swift学习笔记(3)iOS 9 中的网络请求

Swift学习笔记(3)iOS 9 中的网络请求 目录 Swift学习笔记3iOS 9 中的网络请求 目录 编码方法 请求方法 其他修改 完整代码 运行结果 编码方法 在iOS9中,以前常用的stringByAddingPercentEscapesUsingEncoding方法被废除了,取而代之的是stringByAddingPercentEncodingWithAllowedCharacters方法. 用法示例: var strURL=String(format:"http://blog.cs

Swift学习笔记(2)网络数据交换格式(XML,JSON)解析 [iOS实战 入门与提高卷]

Swift学习笔记(2)网络数据交换格式(XML,JSON)解析 参考书籍及资源:iOS实战 入门与提高卷 关东升 参考书籍地址 用NSXML来解析XML文档 用TBXML来解析XML文档 用NSJSONSerialization来解析JSON文档 目录 Swift学习笔记2网络数据交换格式XMLJSON解析 目录 用NSXML来解析XML文档 示例文档Notesxml 创建XMLParser类 调用与运行结果 用TBXML来解析XML文档 准备工作 创建XMLParser类 调用与运行结果 用

Swift学习笔记(1)过渡动画(CATransition和UIViewAnimation)的用法

Swift学习笔记(1)过渡动画(CATransition和UIViewAnimation)的用法 CATransition和UIViewAnimation是场景切换时常用的两种过渡动画 目录 Swift学习笔记1过渡动画CATransition和UIViewAnimation的用法 目录 CATransition CATransition的type属性 CATransition的subtype属性 代码示例 UIViewAnimationTransition UIViewAnimationTr