Swift入门-01

一.What is swift?
“Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。
Swift是一款易学易用的编程语言,而且它还是第一套具有与脚本语言同样的表现力和趣味性的系统编程语言。Swift的设计以安全为出发点,以避免各种常见的编程错误类别。[1]
2015年12月4日,苹果公司宣布其Swift编程语言现在开放源代码。长600多页的 The Swift Programming Language[2] 可以在线免费下载。”————百度百科

二.Why swift?
1.强语言 更明确 更安全
2.更简单
3.结合了各种编程语言的优点

三.Let’s start.
XCode提供了Swift学习的“游乐场” 游乐场 文件更轻便 而且所见即所得 适合学习swift和调试模块逻辑

Snip20170306_1.png

四.初识swift
swift与oc的不同:
1.导入框架更加简洁
2.定义常量或变量的方式(默认是常量 且推荐用常量)
3.语句结尾不用加;
4.for if while switch等语句一般不必要跟()
5.print()直接打印

//1.swift中如何导入框架
import Foundation
//2.定义标识符
//常量
let a:Int = 10
//变量
var b:Double = 12.12
//3.语句结束
//如果一行中只有一行语句 则在语句结束可以不加分号 如果有多行语句需要加分号 但是不推荐一行里有多行语句
//4.打印内容
print(a);

五.类型推导
swift中,如果在声明常量(变量)时直接对常量(变量)进行赋值 常量(变量)类型可以省略 编译器可以根据赋值类型自己推导出类型(类似于js)

var x = 0

let y : Int = 10//Int相当于oc中的NSInteger

//x = 12.03 会报错 因为上面0 默认是Int类型

let view = UIView()
let button = UIButton()

/**
 var m
 m = 10
 报错
 */

/**
 不推荐以下写法 最好在声明的时候 直接初始化
 var m : Int//没有保存内存地址
 m = 10//到这里才保存到内存地址
*/

六.基本运算

let m = 20
let n = 30.50
//var x = m + n//报错 类型不一样不可以进行运算 (oc中可以进行运算)
//整型转浮点 和oc相反 是把要转换的内容用括号括起来
let tempM = Double(m)
let x = tempM + n
print(x)

//浮点型转整型
let tempN = Int(n)
let y = m + tempN
print(y)

let num0 = 30
let num1 = 40.00
var sum = Double(num0) + num1
sum = Double(num0) * num1//无论加减乘除 都必须要相同

七.逻辑分枝
swift用逻辑分枝有: if 、else if、switch、三目运算、gurad(swift特有)

/**
 *  if
 *  >1.if后面的()可以省略(可以不省略 但是 一般都省略)
 *  >2.判断语句不再是非0/nil及真,判断句必须有明确的Bool值(BOOL是oc中的)
 */
//不再有如下语法
//let a = 10
//if a {
//    
//}

let a = 10
if a > 5 {
    print("a>5")
} else {
    print("a<=5")
}

/**
 *  else if 用法和if完全一样
 */
if a + 5 >= 15 {
    print("a>=10")
} else if a + 5 >= 10 {
    print("a>=5")
} else {
    print("a<5")
}

/**
 *  三目运算符
 */
let m = 20
let n = 10
let o = m > n ? m : n

/**
 *  guard
 *  >swift2.0后才推出的
 *  >用法和if非常相似
 *  >任何一个用guard的地方都可以用if代替 但是guard可读性比if要强
 *  >guard必须在函数里使用
 */

let age = 20

func online (age : Int) {
    //1.年龄判断
    guard age >= 18 else {
        //条件不成立 执行这里
        print("不可以上网")
        return//这里是return 还是break 还是continue 需要看具体情况和条件
    }
//    //2.身份证判断
//    guard 身份证判断 else {
//        print("不可以上网")
//        return
//    }
    //以上条件全部成立 执行这里
    print("可以上网")
}

//函数 必须调用
online(age: age)

/**
 *  switch
 *  >swift里的switch比oc里要强
 *  >switch后面可以不加()
 *  >case语句不用加break
 */
//1.基本用法
let sex = 0
switch sex {
case 0:
    print("女")
case 1:
    print("男")
default:
    print("...")
}
//2.基本用法补充
//2.1 如果希望某case会产生case穿透 (case0 -> case1 都执行) 可以在case结束后跟上fallthrough (一般避免产生这种判断 只是有这种语法而已 但是一般不用)
//2.2 case后面可以判断多个条件 用,分割
switch sex {
case 0,1://是0或1
    print("正常人")
default:
    print("...")
}
//3.swift中switch的特殊用法
//3.1 swift中switch可以判断浮点型
let x = 3.14
switch x {
case 3.14:
    print("圆周率")
default:
    print("不是圆周率")
}
//3.2 swift中的switch可以判断字符串
let str = "hi"
switch str {
case "hi":
    print("hi")
default:
    print("不是hi")
}

let x1 = 20
let x2 = 30

let operation = "+"
//if operation == "+" {//== 没有isEqualTo
//    
//}
switch operation {
case "+":
    print(x1 + x2)
default:
    print(0)
}
//3.3 swift中的switch可以判断区间
//区间:通常指数字区间
//开区间:0..<10:表示0~9  //开区间..<
//闭区间:0...10:表示0~10 //闭区间...

let x3 = 80
switch x3 {
case 0..<60:
    print("不及格")
case 60..<80:
    print("及格")
case 80..<90:
    print("优秀")
case 90...100:
    print("666")
default:
    print("厉害了word哥")
}

八.循环
swift中有三种循环方式:for、while、repeat-while(相当于do-while)

//1.for
//for后面的小括号可以省略
//不再有i ++这种格式
//>for in
for i in 0..<10  {
    print(i)
}
//>for in特殊写法
//打印10次hello world
//也可以用上面那个方法 但是 如果一个标志符如果不需要使用 可以用_代替
for _ in 0..<10 {
    print("hello world")
}
//逆序
for i in (0...10).reversed() {
    print(i)
}

//没研究明白
//for i in stride(from: 10, through: 0, by: -1) {
//    print(i)
//}

//2.while 用的比较少
//>while后面的()可以省略
//>while后面的判断没有非零及真(swift没有) 必须有一个明确的Bool值
var a = 30
while a > 25 {
//    a --//++ -- 这种运算符 在swift里都没有了
    a -= 1
    print(a)
}

a = 300
//swift中为repeat-while 不再是do-while
repeat {
a -= 1
    print(a)
} while a > 295

九.swift中的字符串
swift中的字符串String是结构体 效率比NSString高 且String可以转化为NSString

//1.定义字符串
let str = "hello world"
//2.遍历字符串
for c in str.characters {
    print(c)
}
//3.字符串拼接
//3.1 两个字符串拼接(直接用"+")
let str1 = " hi"
let str2 = str + str1
print(str2)
//3.2 字符串和其他标志符拼接 (使用"()")
let name = "ovix"
let age = 23
let height = 177.00
let info = "My name is (name),my age is (age),my height is (height)"
print(info)
//3.3 字符串的格式化
let minute = 2
let second = 20
let s0 = String(format:"%02d:%02d",arguments:[minute,second])
let s1 = String(format:"%02d:%02d",minute,second)
//4.字符串截取 (String->NSString再截取 因为String截取很麻烦)
let urlStr = "www.baidu.com"
//urlStr as NSString String字符串转NSString字符串对象
let header = (urlStr as NSString).substring(to: 3)
let body = (urlStr as NSString).substring(with: NSMakeRange(4, 5))
let footer = (urlStr as NSString).substring(from: 10)

十.swift中的数组
Array

//1.定义数组
//1.1 不可变数组 (用let定义的数组)
let arr0 = ["w","a","n","g"];//不可以是空
let arr1 : [String] = ["w","a","n","g"];//不可以是空  泛型
let arr2 : Array<String> = ["w","a","n","g"];//不可以是空  泛型
//1.2 可变数组 (用var定义的数组)
var mutableArr0 = Array<String>()//可变数组必须用泛型  一般不用这个方法
var mutableArr1 = [String]()//一般用这种方法   泛型

//2.可变数组的操作
//2.1 追加
mutableArr1.append("1")
mutableArr1.append("2")
mutableArr1.append("3")
mutableArr1.append("4")
mutableArr1.append("5")
mutableArr1.append("6")
mutableArr1.append("7")
mutableArr1.append("8")
//2.2 删除(返回值为要删除的元素)
mutableArr1.remove(at: 0)
print("删除第一个后:(mutableArr1)")
//2.3 修改
mutableArr1[0] = "q"
mutableArr1
//2.4 查询
mutableArr1[1]//只有这一种方式

//3.数组的遍历 (swift3.0以后 不再拥有i ++这种语法)
//3.1 根据下标
for i in 0..<mutableArr1.count {
    print(mutableArr1[i])
}
//3.2 直接遍历 (类似oc中for in)
for i in mutableArr1 {
    print(i)
}
//3.3 遍历数组中前两个元素
for i in mutableArr1[0..<3] {
    print(i)
}

//4.数组的合并(数组里面元素类型一致才可以"+"合并)
let arr3 = ["w","a","n","g"]
var arrM = [String]()
arrM.append("o")
arrM.append("v")
arrM.append("i")
arrM.append("x")

//数组里面元素类型一致才可以"+"合并
let arrS = arr3 + arrM

let arr4 = ["x","y","z","w"]
let arr5 = ["x",8,3,2.65] as [Any]

//let arrS2 = arr4 + arr5//报错 因为arr4与arr5数组里面的元素类型不一致

十一.swift中的字典
Dictionary 通过键查找值 键不可以重复 值可以重复 (字典里面的键值对是没有顺序的)

//swift中Dictionary也是泛型集合

//1.定义字典 swift中字典和数组都是[] 系统会自己判断
//1.1 不可变字典
//>系统会自动判断[]中存放的是一个一个的元素 还是键值对
let dic0 : [String:String] = ["1":"w","2":"a","3":"n","4":"g"]
let dic1 = ["name":"wangzihan","age":23,"height":177.00] as [String : Any]
//AnyObject用于指定类型   NSObject用于创建对象
var dicM0 = [String:AnyObject]()
var dicM1 = Dictionary<NSString,AnyObject>()//一般不用这种

//2.可变字典基本操作
//2.1添加
dicM0["name"] = "wang" as AnyObject?
dicM0["age"] = 23 as AnyObject?
dicM0["height"] = 177.00 as AnyObject?
print(dicM0)
//2.2删除
dicM0.removeValue(forKey: "age")
print(dicM0)
//2.3修改
//dicM0.updateValue("wangzihan" as AnyObject, forKey: "name")
dicM0["name"] = "ovixxivo" as AnyObject?//和增加一样
print(dicM0)
//2.4获取
dicM0["height"]

//3.遍历字典
//3.1 遍历所有的key
for key in dicM0.keys {
    print(key)
}
//3.2 遍历所有的value
for value in dicM0.values {
    print(value)
}
//3.3 遍历所有的键值对
for (key,value) in dicM0 {
    print("键:(key),值:(value)")
}

//4.字典合并
//即使类型一致也不可以相加("+")合并
var dic2 = ["name":"ovixxivo","age":23] as [String : Any]
let dic3 = ["score":60.00]

for (key,value) in dic3 {
    dic2[key] = value
}
dic2

十一.swift中的元组
1.元组为swift语言中特有的 oc中没有类似的东西
2.元组通常作为方法的返回值
3.元组是一种数学中使用广泛数据结构
4.元组类似于数组和字典的杂交
5.组成元组里面的所有数组称为”元素”

//1.元祖的最基本写法(类似于数组)
let info = ("name",23,177.0)
info.0//取第几个 数组是[0] 元组是.0
info.1//取第几个
info.2//取第几个
//2.给元组中每一个元素起别名(类似于字典) 可以只给个别元素起别名
let info1 = (name : "name",23,177.0)
print(info1.name,info1.0)//即使设置了别名 使用.0还是可以取到该元素
//3.元组中元素的别名就是元组的名称
let (name,age,height) = ("ovix",23,177.0)
//直接取
name
age
height
//最常用的写法是所有的元素都设置别名
let info2 = (name : "name",age : 23,height : 177.0)

十二.swift中最蛋疼的类型————可选类型
在OC中 如果一个变量在声明的时候不马上使用 可以赋值为0或nil
swift中规定:对象中的任何属性 在创建的时候都必须有明确的初始化值
但是,在swift中 nil是一种特殊的类型 和变量实际的类型不匹配(UIView()、String等) 所以不可以给这些变量赋值为nil
在开发中把对象赋值为nil在所难免 所以swift里出现了一个可选类型
//var name : String = nil//报错 因为nil是一种特殊的类型

/*真实用途*/
class Student:NSObject {
    var name : Optional<String>//可选类型 规定是字符串
    var nickName : String?//一般都用这种
}

//可选类型Optional

/*模拟类中的成员变量*/
//1.定义可选类型
//1.1 常规方式(不常用)
var name : Optional<String> = nil
//1.2 语法糖(常用)
var nickName : String?

//2.可选类型赋值
name = "ovix"

//3.取出可选类型中的值
print(name)//Optional("ovix")
//可选类型 用"!"取出内容(强制解包)
//强制接报是非常危险的操作,如果可选类型为nil 强制解包 程序会崩溃(报错)
//建议在强制解包前对可选类型进行判断,看是否为nil
if name != nil {
    print(name!)//ovix
}

//4.可选绑定:定义一个临时常量(变量)等于原来的可选类型变量 然后对这个临时常量(变量)进行操作   如果想要多次打印以上的name的值 多次name!解包显然不是好的方法
//step1>判断name是否有值 如果没有值 不执行{}中内容
//step2>如果name有值 系统会自动将name解包 并把name解包后的值赋值给tempName
//4.1 不常用
if var tempName = name {
    print(tempName)
}
//let tempName = name
//print(tempName)//这样打印的还是Optional("ovix")

//4.2 常用 (直接用原本的变量名就可以) 如果不再用原本的name就用这个方法 如果还需要用原来的name 那么就用上面那种方法
if let name = name {
    print(name)
}

5.使用场景
//通过String创建一个URL (swift3之后URL URLRequest开始逐渐代替NSURL NSURLRequest)
let url = URL(string: "https://www.baidu.com")
//URL创建Requst
if let url = url {//如果字符串里有汉字 url创建出来就是nil 所以还是需要先进行可选绑定
    let requst : URLRequest = URLRequest(url: url)
    print(requst)
}
IT文库 » Swift入门-01
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址