在学习Swift的过程中,加入与OC的对比,这样更好理解,记忆.
1.0 if和switch分支:
--if:
/*Swift中的if和OC中的if"几乎"一模一样
* Swift中的if可以省略后面的圆括号
* OC中的if如果后面只有一条语句, 那么大括号可以省略, 而Swift中不行
* OC中的条件表达式非0即真, 而Swift中不行
* Swift中提供了真正的Bool类型, true/false, 条件表达式的值必须是true/false
*/
let num = 10
if (num == 10)
{
print("number等于10")
}
if num == 10
{
print("number等于10")
}
/*:
Switch
* switch后面的圆括号可以省略
* 如果是在OC中每个case后面不写break, 导致穿透. 而在Swift中不会
* 如果是在OC中想在case后面定义变量, 必须加上{}说明作用域, 而在Swift中不用说明作用域
* 如果是在OC中default的位置可以随便写, 而在Swift中不允许
* 如果是在OC中default可以不用写, 而在Swift中大部分情况下是必须写的
*/
let value = 3
switch value
{
case 0:
print("0")
var i = 10
case 1:
print("1")
case 2:
print("2")
case 3:
print("3")
case 4:
print("4")
default:
print("other")
}
1.1 分支相关:
/*:
三目运算符
* 格式: 条件表达式 ? 取值1 : 取值2
* 注意: 运算符之间需要有空格
* 提醒: 在Swift开发中三目运算符用得非常多
*/
let num = 7
let res = (num == 10) ? 10 : 5
/*:
可选类型(Optional)
只要看到数据类型后面有 ? !
* 含义: 可以有值也可以没有值, 只有可选类型的变量才能赋值nil
* convenience init? 返回一个可选类型的值
* 注意: 如果输出可选类型的值, 会包装一个Optional
* 如果在变量的后面加上一个!, 代表告诉系统该变量一定有值
* !称之为强制解包
* 注意: 如果可选类型的变量中没有值, 而又进行了强制解包, 那么会引发一个运行时的错误
* 开发技巧: 作为初学者, 不要去纠结? ! ??这些符号, 初期利用Xcode开发工具提醒来解决这些问题, 后期再深入研究什么时候使用? 什么时候使用!
*/
let url = NSURL(string: "http://www.baidu.com")
print(url!)
let url2 = NSURL(string: "http://news.baidu.com")
//print(url2!)
if url != nil
{
print(url!)
}
/*
自动解包
* 如果数据类型后面写的是!, 那么在使用该变量时系统会自动给我们解包
*/
let url4: NSURL! = NSURL(string: "http://www.baidu.com")
print(url4)
// 注意点: 数据类型后面不要随意添加!, 因为如果没有值会报错
let url5: NSURL! = NSURL(string: "http://news.baidu.com")
//print(url5)
/*:
可选绑定
* 格式: if let 变量名称 = 可选类型变量 {}
* 优点: 只要能进入大括号, 那么可选类型变量就一定有值
*/
if let url3 = url
{
// 在if中不用对url3进行强制解包, 因为在赋值的过程中系统已经帮我们解包了
print(url3)
}
1.2 循环相关:
/*:
Swift中的循环和OC中的循环 "基本"一致
for
while
do while -- > Swift是 repeat while
*/
//: 常规写法
// 其它特点和if一样
for var i = 0; i < 10; i++
{
print(i)
}
//: Swift中的写法
// 后面的 0..<10 称之为半壁区间
// 半闭区间特点: 包含头不包含尾
for i in 0..<10
{
print(i)
}
// 闭区间: 包含头包含尾
// 注意点: .../..< 中间不能有空格
for i in 0...10
{
print(i)
}
// while: Swift开发中很少使用while
var index = 0
while index < 10
{
print(index)
index++
}
// repeat while
var i = 0
repeat{
print(i)
i++
}while(i < 10)
1.3 数组相关:
/*:
数组
* 格式: []
* 注意点: let 不可变数组 var 可变数组
*/
let arr1 = ["10", "20", "30"]
// 特点: 自动将基本数据类型转换为对象类型
var arr2 = [10, "20", 99.9]
// 获取
print(arr2[1])
// 修改
arr2[2] = 100
arr2
// 追加
arr2.append(33)
// 删除, 数组的删除方法会将被删除的元素返回给我们
arr2.removeAtIndex(0)
arr2
// keepCapacity: 删除数组中的元素, 是否需要保持数组原有的容量, 如果传入false代表不保持容量
arr2.removeAll(keepCapacity: false)
arr2.capacity
// 注意点: 数组添加容量永远是在原有容量的基础上*2
arr2.append(1)
arr2.capacity
arr2.append(2)
arr2.capacity
arr2.append(3)
arr2.capacity
// 合并
var arr3 = [1, 3, 5]
var arr4 = [2, 4, 6]
arr3 += arr4
arr3
//var arr5 = ["8", "9"]
//arr3 += arr5
for item in arr3
{
print(item)
}
1.4 字典:
/*
字典
* OC @{key:value}
* Swift [key:value]
* 和数组一样, 如果用let修饰就是不可变字典, 如果用var修饰就是可变字典
*/
// 开发技巧: 在iOS开发中使用频率最高的就是 [String: AnyObject]
let dict1 = ["name": "stone", "age": 3]
var dict2:[String: AnyObject]
dict2 = ["name": "stone", "age": 3]
// 获取
// 注意点: 从字典中取出的值都是可选类型的值
// 因为通过一个key取值, 可能取得到, 也可能取不到, 所以返回一个可选类型的值
// 如果!写在[]后面, 代表取出来的值一定有值
// 如果!写在dict后面, 代表dict一定有值
print(dict2["name"]!)
// 更新
dict2["name"] = "stone"
dict2
// 添加
// 也就是说, 如果key存在就是更新, 如果key不存在就是添加
dict2["score"] = 99
dict2
// 遍历
for key in dict2.keys
{
print(dict2[key])
}
// 会将字典中的key赋值给()中的第一个变量
// 会将字典中的value赋值给()中的第二个变量
// 注意: k/v随便写
// ()括起来的东西我们称之为元祖, 元祖是Swift中新增的一种数据类型
for (xx, oo) in dict2
{
print(xx)
print(oo)
}
// 合并
var dict3:[String: AnyObject] = ["name": "stone", "age": 3]
var dict4:[String: AnyObject] = ["score": 99]
// 字典不能像数组一样通过+=来合并
//dict3 += dict4
for (k, v) in dict3
{
dict4[k] = v
}
dict4
1.5 字符串相关:
import UIKit
/*:
字符串
* OC: @""
* Swift: ""
* 特点:
1.OC中的字符串是一个对象, Swift中的字符串是一个结构体
2.Swift中的字符串的性能比OC中的高
3.虽然OC中的字符串是一个对象, 而Swift中的字符串是一个结构体, 但是在Swift开发中可以在这两个数据类型之间快速的进行转换
*/
var str = "stone"
for c in str.characters
{
print(c)
}
// 字符串的拼接
let name = "stone"
let gender = "man"
// 目标: name = stone, gender = man
//NSLog(@"name = %@, gender = %@", name, gender)
// 注意: Swift的print函数不支持%i/%@等占位符
//print("name = %@, gender = %@", name, gender)
// Swift中拼接内容使用 \(需要拼接的数据)
print("name = \(name), gender = \(gender)")
// 10.987654321 --> 10.98
let dValue = 10.987654321
let res = String(format: "%.2f", arguments: [dValue])
print(res)
// 15-09-07
let res2 = String(format: "%02d-%02d-%02d", arguments: [15, 9, 7])
print(res2)
// 字符串截取
// 在Swift开发中字符串截取是一件非常非常非常蛋疼的问题
// 建议: 在Swift开发中如果要截取字符串, 或者以前在OC中使用的方法在Swift字符串中没有, 建议先将Swift字符串转换为OC字符串之后再使用
let str2 = "stoneleon"
//let str3 = str2 as NSString
//let str3: NSString = str2
let str4 = (str2 as NSString).substringWithRange(NSMakeRange(0, 4))
print(str4)
let str5:NSString = "user/desktop/abc.txt"
str5.pathExtension
1.6 函数相关:
/*:
函数:
* 格式 func 函数名称(参数列表) -> 返回值类型 {}
*/
// 没有返回值没有参数的
func say() -> Void
{
print("hello")
}
say()
// 如果没有返回值还可以简写
// Void == ()
func say2() -> ()
{
print("world")
}
say2()
// 如果没有返回值, 那么返回值类型可以省略
func say3()
{
print("stone")
}
say3()
// 有返回值没有参数的
// 注意点: 返回值类型必须和返回的值保持一致
func getMax() ->Int
{
return 998
}
print(getMax())
// 没有返回值有参数的
// - (void)sum:(int)a b:(int)b;
// [self sum:10 b: 20];
// 从Swift2.0开始, 会自动将第二个参数开始的参数名称作为方法的标签
func sum(a: Int, b: Int)
{
print("sum = \(a + b)")
}
sum(10, b: 20)
// 单独指定方法的标签(提高阅读性)
// 可以在内部参数的前面加上外部参数名称
// 内部参数: a/b , 给函数内部使用的
// 外部参数: x/y , 给调用者使用的
func sum2(x a: Int, y b: Int)
{
print("sum = \(a + b)")
}
sum2(x: 30, y: 30)
// Swift2.0之前
// 代表a/b既是内部参数也是外部参数
//func sum(#a: Int, #b: Int)
//{
// print("sum = \(a + b)")
//}
//sum2(a: 30, b: 30)
// 默认值
// 如果指定了默认值, 那么调用的时候可以忽略, 如果忽略会使用默认值
// 在其它语言中其实早就有默认值的概念了, 在其它语言中的默认值只能写在形参列表的最后面
// 但是Swift中的默认值可以写在任意地方
func sum3(a: Int, b: Int = 110)
{
print("sum = \(a + b)")
}
//sum3(50, b: 10)
sum3(50)
func sum4(a: Int = 88, b: Int = 100)
{
print("sum = \(a + b)")
}
//sum4(b: 88)
sum4()
// 有返回值有参数的
func sum5(a: Int, b: Int) -> Int
{
return a + b
}
print(sum5(20, b: 20))
未完待续...