可选项判断

  • 由于可选项的内容可能为 nil,而一旦为 nil 则不允许参与计算
  • 因此使用中,经常需要判断可选项的内容是否为 nil

单个可选项判断

let url = NSURL(string: "http://www.baidu.com")

//: 方法1: 强行解包 - 缺陷,如果 url 为空,运行时会崩溃
let request = NSURLRequest(URL: url!) //: 方法2: 首先判断 - 代码中仍然需要使用 `!` 强行解包
if url != nil {
let request = NSURLRequest(URL: url!)
} //: 方法3: 使用 `if let`,这种方式,表明一旦进入 if 分支,u 就不在是可选项
if let u = url where u.host == "www.baidu.com" {
let request = NSURLRequest(URL: u)
}

可选项条件判断

//: 1> 初学 swift 一不小心就会让 if 的嵌套层次很深,让代码变得很丑陋
if let u = url {
if u.host == "www.baidu.com" {
let request = NSURLRequest(URL: u)
}
} //: 2> 使用 where 关键字,
if let u = url where u.host == "www.baidu.com" {
let request = NSURLRequest(URL: u)
}
  • 小结

    • if let 不能与使用 &&|| 等条件判断
    • 如果要增加条件,可以使用 where 子句
    • 注意:where 子句没有智能提示

多个可选项判断

//: 3> 可以使用 `,` 同时判断多个可选项是否为空
let oName: String? = "张三"
let oNo: Int? = 100 if let name = oName {
if let no = oNo {
print("姓名:" + name + " 学号: " + String(no))
}
} if let name = oName, let no = oNo {
print("姓名:" + name + " 学号: " + String(no))
}

判断之后对变量需要修改

let oName: String? = "张三"
let oNum: Int? = 18 if var name = oName, num = oNum { name = "李四"
num = 1 print(name, num)
}

for 循环

  • OC 风格的循环
var sum = 0
for var i = 0; i < 10; i++ {
sum += i
}
print(sum)
  • for-in,0..<10 表示从0到9
sum = 0
for i in 0..<10 {
sum += i
}
print(sum)
  • 范围 0...10 表示从0到10
sum = 0
for i in 0...10 {
sum += i
}
print(sum)
  • 省略下标

    • _ 能够匹配任意类型
    • _ 表示忽略对应位置的值
for _ in 0...10 {
print("hello")
}

字符串

在 Swift 中绝大多数的情况下,推荐使用 String 类型

  • String 是一个结构体,性能更高

    • String 目前具有了绝大多数 NSString 的功能
    • String 支持直接遍历
  • NSString 是一个 OC 对象,性能略差
  • Swift 提供了 String 和 NSString 之间的无缝转换

字符串演练

  • 遍历字符串中的字符
for s in str.characters {
print(s)
}
  • 字符串长度
// 返回以字节为单位的字符串长度,一个中文占 3 个字节
let len1 = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
// 返回实际字符的个数
let len2 = str.characters.count
// 返回 utf8 编码长度
let len3 = str.utf8.count
  • 字符串拼接

    • 直接在 "" 中使用 \(变量名) 的方式可以快速拼接字符串
let str1 = "Hello"
let str2 = "World"
let i = 32
str = "\(i) 个 " + str1 + " " + str2

我和我的小伙伴再也不要考虑 stringWithFormat 了 :

  • 可选项的拼接

    • 如果变量是可选项,拼接的结果中会有 Optional
    • 为了应对强行解包存在的风险,苹果提供了 ?? 操作符
    • ?? 操作符用于检测可选项是否为 nil
      • 如果不是 nil,使用当前值
      • 如果是 nil,使用后面的值替代
let str1 = "Hello"
let str2 = "World"
let i: Int? = 32
str = "\(i ?? 0) 个 " + str1 + " " + str2
  • 格式化字符串
  • 如果需要指定字符串格式,可以使用 String(format:...) 的方式
let h = 8
let m = 23
let s = 9
let timeString = String(format: "%02d:%02d:%02d", arguments: [h, m, s])
let timeStr = String(format: "%02d:%02d:%02d", h, m, s)

String & Range 的结合

  • 在 Swift 中,String 和 Range连用时,语法结构比较复杂
  • 如果不习惯 Swift 的语法,可以将字符串转换成 NSString 再处理
let helloString = "我们一起飞"
(helloString as NSString).substringWithRange(NSMakeRange(2, 3))
  • 使用 Range 的写法
let startIndex = helloString.startIndex.advancedBy(0)
let endIndex = helloString.endIndex.advancedBy(-1) helloString.substringWithRange(startIndex..<endIndex)

最新文章

  1. python opencv 实现Reinhard颜色迁移算法
  2. 盘点JavaScript里好用的原生API
  3. CSS3背景
  4. HDU 5398 (动态树)
  5. Tornado实战项目(伪JD商城)
  6. windows电脑优化
  7. Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackOverflowError
  8. nrf51822裸机教程-PPI
  9. Linux command: usermod -- 改变用户状态
  10. SQLite数据库和JPA简单介绍
  11. 获得临时文件目录(Temp文件夹)
  12. python 基础——*args和**kwargs
  13. SQL日志文件的作用
  14. QT正则表达式
  15. 基于visual Studio2013解决C语言竞赛题之1033数字交换
  16. php专业面试总结
  17. Java IO(四)
  18. SQL LOADER使用
  19. inventory file 与hosts patterns (ansible 机器清单 与 主机匹配模式)
  20. ES系列一、CentOS7安装ES 6.3.1、集成IK分词器

热门文章

  1. 爬虫入门系列(二):优雅的HTTP库requests
  2. require.js疑惑
  3. Mybatis(一) mybatis入门
  4. FPGA中将十进制数在数码管中显示(verilog版)--二进制转换为BCD码
  5. .NET Framework 4.7 安装
  6. iOS WebView你需要的问题答案
  7. Oracle空间查询 ORA-28595
  8. linux下安编译安装redis
  9. poj2104 Kth-Number
  10. DirectFB 之 字体显示