初窥Swift:从0到1

作者: 張贺 | 来源:发表于2016-08-13 00:54 被阅读266次
图片来自500px

文 || 張贺

导入框架


//OC中导入框架
#import <UIKit/UIKit.h>
//Swift中导入框架
import UIKit

语句结束


如果一行中只有一条语句,那么该语句结束后,可以不加 ; ,可以省略
但是如果一行中有多条语句,那么需要以 ; 分割

打印内容


let a : Int = 20
//OC中打印内容
//NSLog(@"%d",a);
//Swift中的打印
print(a)

定义标识符


  • Swift中定义标识符必须告诉编译器是一个常量还是变量
  • 声明常量使用 let 修饰,定义之后不可以修改
  • 声明变量使用 var 修饰,定义之后可以修改
//OC中定义一个标识符
//int a = 10;
//格式  let / var 标识符的名称 : 标识符的数据类型 = 值
//声明常量,其值之后将不能修改
let a : Int = 20
//声明变量,其值在之后可以修改
var b : Int = 10
//修改变量的值
b = 30
  • 常量的本质是其保存的内存地址不可以修改,但是可以通过内存地址拿到对象内部的属性进行修改
//OC中创建UIView
//UIView *view = [[UIView alloc]init];
let view : UIView = UIView()
//通过常量view中保存的内存地址找到UIView对象修改他的backgroundColor属性
//OC中设置view的背景颜色
//view.backgroundColor = [UIColor redColor]
view.backgroundColor = UIColor.redColor()

类型推导


如果在初始化标识符的时候给其赋值可以省略其类型
可以按住option + 鼠标左键查看数据类型

//let a : Int = 20
let a = 20                              //a为Int类型
//let view1 : UIView = UIView()
let view1 = UIView()                    //view1是UIView类型
let view1 = UIButton()                  //view1是UIButton类型

基本运算


Swift中不存在隐式转换,基本运算必须保证类型一致

let m = 20      //Int类型
let n = 3.14    //Double类型
//将int类型转换成double类型:Double(m)
let result = Double(m) + n
//将double类型转换成int类型: Int(n)
let result2 = m + Int(n)

逻辑分支


if、if - else、else if

Swift中的if与OC中的if主要有2点不同:

  1. if后面的()可以省略
  2. 判断条件不再有非0 / nil即真,判断句必须有明确的真假(Bool--->ture / false)
//OC这种判断是可以的,但在Swift中不可以
//int a = 10;
//if (a) {
//    NSLog(@"判断为真");
//}

//Swift中的if else判断
let a = 10
if a > 0 {
    //Swift中的字符串没有 @ 符号
    print("a大于0")
}else{
    print("a小于等于0")
}

//else if 用法和if一致
let score = 99
if score < 0 || score > 100{
    print("分数异常")
}else if score < 60{
    print("不及格")
}else if score < 80{
    print("及格")
}else if score < 90{
    print("良好")
}else if score <= 100{
    print("优秀")
}
三目运算
let a = 10
let b = 20

//var max = 0

//if a > b {
//    max = a
//}else{
//    max = b
//}
//三目运算
let max = a > b ? a : b
guard的使用
  • guard是Swift2.0新增的语法
  • 他与if语句非常类似,他设计的目的是提高程序的可读性
  • guard语句必须带有else语句,他的语法如下:
  • 当条件表达式为true的时候跳过else语句中的内容,执行语句组内容
  • 条件表达式为false的时候执行else语句中的内容,跳转语句一般是return、break、continue和throw
guard  条件表达式  else  { 
    //语句
    break
}
语句组

列子:

import UIKit

/**
判断一个人是否可以去网吧上网?
1.是否满18岁?
2.是否带了身份证?
3.是否带了钱?
*/

//这个函数用来判断一个人是否可以去网吧上网?
//用if else 实现,当多重if嵌套的时候可读性并不好
func online (age : Int,IDCard : Bool,Money : Bool){
    //1.是否满18岁?
    if age >= 18 {
        //2.是否带了身份证?
        if IDCard == true{
            //3.是否带了钱?
            if Money == true{
                print("可以上网")
            }else{
                print("已满18岁,带了身份证,没有钱不能上网")
            }
        }else{
            print("已满18岁,但没带身份证,不能上网")
        }
    }else{
        print("未满18岁,不能上网")
    }
}

//用guard实现,可读性更高
func online (age : Int,IDCard : Bool,Money : Bool){
    //1.是否满18岁?
    guard age >= 18 else{
        print("未满18岁,不能上网")
        return
    }
    //2.是否带了身份证?
    guard IDCard == true else{
        print("已满18岁,但没带身份证,不能上网")
        return
    }
    //3.是否带了钱?
    guard Money == true else{
        print("已满18岁,带了身份证,没有钱不能上网")
        return
    }
    print("可以上网")
}

let age = 20
let idCard = true
let money = false
//调用函数
online(age, IDCard: idCard, Money: money)
switch的使用
  • 苹果对switch进行了大大的增强,使其拥有其他语言中没有的特性
  • 与OC的不同之处:
  • switch后面可以没有()
  • case后面也可以没有break(默认会自动加上break,虽然看不见)
import UIKit

//0 带表男 1 代表nv
let sex = 1
//基本用法,与OC一样
switch sex{
case 0:
    print("男")
case 1:
    print("女")
default:
    print("其他")
}

//补充:
//1.如果想让case产生穿透,可以在case结束后加上fallthrough
//2.case后面可以判断多个条件,条件之间以 , 分割
switch sex{
case 0 ,1:
    print("正常人")
default:
    print("其他")
}

Swift中switch的特殊用法:
switch可以判断浮点型

let a = 3.14
switch a {
case 3.14:
    print("π")
default:
    print("不是π")
}

switch可以判断字符串

let m = 10
let n = 20

let operation = "*"
var result = 0

switch operation{
case "+":
    result = m + n
case "-":
    result = m - n
case "*":
    result = m * n
case "/":
    result = m / n
default:
    print("非法操作符")
}

switch可以判断区间
区间:
开区间 0..<10 代表0~9 ,不包括10
闭区间 0...10 代表0~10,包括10

let score = 100
switch score{
case 0..<60:
    print("不及格")
case 60..<80:
    print("及格")
case 80..<90:
    print("良好")
case 90...100:
    print("优秀")
default:
    print("不合法分数")
}

循环结构


for循环
//OC写法
//for (int i = 0 ; i < 10 ; i++){
//    NSLog(@"%d", i);
//}

//Swift写法
//for后面的()可以省略
//1.for循环的基本写法
for var i = 9; i >= 0; i-- {
    print(i);
}

for循环的for in写法

for i in 0..<10 {
    print(i)
}

for循环的for in写法(特殊)
在Swift中如果一个标识符不需要使用,可以使用 _ 来代替

for _ in 0...9 {
    print("hello world")
}
while / do while

while后面的()可以省略
while判断句里面不存在非0即真

var a = 10
//OC写法
//while (){
//
//}

//Swift写法
while a > 0{
    print(a)
    a--
}

//OC写法
//do{
//
//}while()

//Swift写法
repeat {
    print(a)
    a--
}while a > 10

字符串


  • OC和Swift中字符串的区别
  • 在OC中字符串类型是NSString,在Swift中字符串类型是String
  • OC中字符串@"",Swift中字符串""
  • 使用String的原因
  • String是一个结构体,性能更高
  • NSString是一个OC对象,性能略差
  • String支持直接遍历
  • Swift提供了String和NSString之间的无缝转换

创建字符串

//直接指定为String类型
//let str : String = "hello world"
//通过类型推导
let str = "zhanghe"

遍历字符串

for c in str.characters{
    print(c)
}

字符串的拼接
两个字符串之间的拼接

let str1 = "hello"
let str2 = "world"

let str3 = str1 + str2

字符串和其他标识符之间的拼接

let name = "zhanghe"
let age = 18
let hight = 1.90

let info = "my name is \(name) , age is \(age) , hight is \(hight)"

拼接字符串时,字符串的格式化

//08:12
let min = 8
let second = 2

let timeStr = String(format: "%02d:%02d", arguments: [min,second])

字符串的截取

let urlStr = "www.baidu.com"

//这种方法需要传一个Index类型,比较麻烦
//let head = urlStr.substringFromIndex(index: Index)
//这里先把String转换成NSString在进行截取,这里就可以传一个int
let head = (urlStr as NSString).substringToIndex(3)
let body = (urlStr as NSString).substringWithRange(NSMakeRange(4, 5))
let foot = (urlStr as NSString).substringFromIndex(10)

数组


  • 数组(Array)是一串有序的由相同类型元素构成的集合
  • 数组中的集合元素是有序的,可以重复出现
  • Swift中的数组类型是Array,是一个泛型集合

定义数组

//1.1 定义不可变数组:使用let修饰的标识符创建出来的数组就是不可变数组
let names = ["zh","lsy","cq","lkp"]
//1.2 定义可变数组:使用var修饰的标识符创建出来的数组就是可变数组
//两种方法一样,但实际开发中用下面的
//let namesM = Array<String>()
var namesM = [String]()

对可变数组的基本操作

//2.1 添加元素
namesM.append("lf")
namesM.append("sl")
namesM.append("nm")

//2.2 删除元素
//2.2.1 删除所有元素
//namesM.removeAll()
//2.2.2 删除指定index位置的元素
namesM.removeAtIndex(0)

//2.3 修改元素
namesM[0] = "wsp"

//2.4 查找元素
namesM[1]

数组的遍历

//3.1 根据下标进行遍历
for i in 0..<names.count{
    print(names[i])
}

//3.2 直接遍历数组中的元素
for name in names{
    print(name)
}

//3.3 遍历数组中的前两个(比较少见)
//for i in 0..<2{
//    print(names[i])
//}
for name in names[0..<2]{
    print(name)
}

数组的合并:只有相同类型才可以相加合并

let resultArray = names + namesM
//注意:相同类型的数组才能进行合并,不同类型的数组不能进行合并
let array = ["hhh" ,18 ,90]   //[NSObject]
let array1 = ["ggg" ,"ll"]    //[String]
let addArray = array + array1   //错误的

字典


  • Swift字典类型是Dictionary,也是一个泛型集合

定义字典

//1.1 定义不可变字典:使用let修饰
//系统会自动判断[]中存放的是键值对(字典)还是一个一个的元素(数组)
let dict = ["name" : "zh","age" : 18,"height" : 1.88]

//1.2 定义可变字典:使用var修饰
//var dictM = [String : NSObject]()
//AnyObject一般用来指定类型 NSObject一般用来创建对象
var dictM = [String : AnyObject]()

对可变字典的基本操作(增删改查)

//2.1 添加键值对
dictM["name"] = "llny"
dictM["age"]  = 17
dictM["height"] = 1.99
dictM["weight"] = 70
dictM

//2.2 删除键值对
//删除所有的键值对,清空字典
//dictM.removeAll()
dictM.removeValueForKey("weight")

//2.3 修改字典中某一个key对应的value
//区别:如果字典中存在指定的key就修改对应的value,如果不存在指定的key就添加一对键值对
dictM["name"] = "lf"
dictM

//2.4 查找某一个key对应的value  
dictM["age"]

字典的遍历

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

字典的合并

//即使两个字典的类型完全一致,也不能直接相加合并
var dict1 = ["name" : "jj" , "age" : 44]
let dict2 = ["height" : 1.88 , "phoneNum" : "+86 120"]

//let result = dict1 + dict2 //错误写法
for (key , value) in dict2{
    dict1[key] = value
}
dict1

元祖


  • 元祖是Swift中特有的,OC中并没有相关类型
  • 他是什么呢?
  • 他是一种数据结构
  • 类似于数组或者字典
  • 可以用于定义一组数据
  • 组成元祖类型的数据可以成为“元素”
//1.使用数组定义一组数据
let array = ["zh" , 18 , 1.88]
array[0]
array[1]

//2.使用字典定义一组数据
let dict = ["name" : "zh", "age" : 18, "height" : 1.88]
dict["name"]        //"zh"
dict["age"]          //18

//3.使用元祖(一般用于作为方法的返回值)
//3.1 元祖的基本使用
let info = ("zh", 18, 1.88)
info.0        //"zh"
info.1          //18

//3.2 可以给元祖的每一个元素起一个别名(使用最多)
let info1 = (name : "zh", age : 18, height : 1.88)
info1.name        //"zh"
info1.age          //18
info1.height        //1.88

//3.3 元祖中元素的别名,就是元祖的名称
let (name, age, height) = ("zh", 18, 1.88)
name        //"zh"
age          //18
height    //1.88

可选类型


  • 在OC开发中,如果一个变量暂时不用,可以赋值为0(基本数据类型)或者赋值为空(对象类型)
  • 在Swift开发中,nil也是一个特殊的类型,因为和真实的类型不匹配是不能赋值的(Swift是强类型语言)
  • 但是开发中赋值nil,在所难免,因此退出了可选类型

定义可选类型

//var name : String = nil //nil也是一种数据类型,把nil类型赋值给String类型是不可以的
//1.1 方式一:常规方式(不常用)
//var name : Optional<String> = nil   //nil
//1.2 方式二:语法糖(常用)
var name : String? = nil     //nil

给可选类型赋值

name = "zh"    //"zh"

取出可选类型的值

print(name)     //"Optional("zh")\n"
// 可选类型 + !:强制解包
//print(name!)    //"zh\n"

//注意:强制解包是一个危险操作,如果可选类型的值为nil,强制解包会导致系统崩溃
//建议:在强制解包前对可选类型判断是否为nil
if name != nil{
    print(name!)
}

//4.可选绑定
//可选绑定做了两件事情:
//1.判断name是否有值,如果没有值,直接不执行{}
//2.如果name有值,系统自动将name解包,并把解包后的值赋值给tempName
//写法一:不常用
if let tempName = name{
    print(tempName)    //"zh\n"
}

//写法二:常用
if let name = name{
    print(name)       //"zh\n"
}

例子:

//可选类型的应用场景
//根据一个String创建一个url
//没有指定类型
//let url = NSURL(string: "http://www.baidu.com")
//指定类型
let url : NSURL? = NSURL(string: "http://www.baidu.com")

//根据url创建一个nsurlrequest
//let request = NSURLRequest(URL: url)) // 直接把url传过来是报错的,因为url是一个NSURL的可选类型(NSURL?)这里需要传一个(NSURL)

//强制解包
if url != nil{
    let request = NSURLRequest(URL: url!)
}

//可选绑定
if let url = url{
    let request = NSURLRequest(URL: url)
}

函数


  • 函数的格式如下:
    func 函数名(参数列表) -> 返回值类型{
    代码块
    return 返回值
    }
  • func是关键字,多个参数列表之间用逗号 , 分割,也可以没有参数
  • 使用箭头“->”指向返回值类型
  • 如果函数没有返回值,返回值为Viod,并且“->”返回值类型部分可以省略
//1.没有参数没有返回值的函数
func about() -> Void{
    print("iPhone 100")
}
func about1(){
    print("iPhone 100")
}
about()

//2.没有参数有返回值的函数
func readMessage() -> String{
    return "where are you?"
}
readMessage()

//3.有参数没有返回值的函数
func callPhone(num : String){
    print("call \(num)")
}
callPhone("86+10086")

//4.有参数有返回值的函数
func sum(num1 : Int, num2 : Int) -> Int{
    return num1 + num2
}
//这种函数调用的时候看上去有点怪
//如果是这样sum(num1 : 10, num2: 20)舒服一些
sum(10, num2: 20)

函数的使用注意:

//两个数相加
func sum(num1 : Int, num2 : Int) -> Int{
    return num1 + num2
}
sum(10, num2: 20)

注意一:内部参数和外部参数

//内部参数:在函数内部可以看到的参数就是内部参数,默认情况下所有的参数都是内部参数
//外部参数:在函数外部可以看见的参数就是外部参数,默认情况下从第二个参数开始既是内部参数也是外部参数
//如果希望第一个参数也是外部参数,可以在标识符前给该参数添加一个别名

func sum(num1 num1 : Int, num2 : Int) -> Int{
    return num1 + num2
}
sum(num1: 30, num2: 11)

注意二:Swift中的默认参数

//你想要一杯什么咖啡,传给这个函数,就会返回一杯咖啡给你
//你要传参数我就用,你要不传就给你一个默认的值
func makeCoffee(coffeeName : String = "雀巢") -> String{
    return ("制作了一杯\(coffeeName)咖啡")
}
//要了一杯拿铁
makeCoffee("拿铁")     //"制作了一杯拿铁咖啡"
//要了一杯卡布奇诺
makeCoffee("卡布奇诺")    //"制作了一杯拿铁咖啡"
//随便???
makeCoffee()        //"制作了一杯雀巢咖啡"

注意三:可变参数

//参数的个数不确定:例如2个数相加、3个数相加、4个数相加、5个、6个、7、8...具体几个数字相加根据你传的个数
func sum(num : Int...) -> Int{
    var result = 0
    for n in num{
        result += n
    }
    return result
}

//sum(<#T##num: Int...##Int#>)
sum(1, 2, 3)
sum(1, 2, 3, 4, 5)

注意四:指针类型

var m = 10
var n = 40
//想要交换2个变量的值
//值传递,并不能交换
func swapNum(var m : Int,var n :Int){
    let temp = m
    m = n
    n = temp
}
swapNum(m, n: n)
print(m)                   //10

//指针传递,交换2个变量的值
func swapNum(inout m : Int,inout n :Int){
    let temp = m
    m = n
    n = temp
}

swapNum(&m, n: &n)
print(m)          //40

注意五:函数的嵌套使用

func text(){
    func demo(){
        print("demo")
    }
    demo()
    print("text")
}

text()

待续

相关文章

  • 初窥Swift:从0到1

    文 || 張贺 导入框架 语句结束 如果一行中只有一条语句,那么该语句结束后,可以不加 ; ,可以省略但是如果一行...

  • <从0到1> 初读

    Paypal创始人、Facebook的第一位外部投资者Peter Thiel的这本经典创业书,才读完第一遍,有所收...

  • 初读《从0到1》

    抽空看了彼得·蒂尔的《从0到1》,开篇的几章内容就令人惊艳。但是也对我们的课程《水平思考》有一定的干扰,主要还是出...

  • Swift从0到1(零):序

    写在前面 其实我也只是一个IOS新人,在一步步学习Swift编程过程中,一次次掉进坑里,再一次次爬出来,这次我要把...

  • 从0到0,从0到1。

    昨天和一客户交流,听到这么一句话,我现在的阶段勉强算0到0的阶段,到那个1的阶段还没有看到,或者说并不知道那个1在...

  • Swift - 基本数据类型,及常/变量声明

    原文地址:从0到1,Swift系统学习路线 (本文代码已升级至Swift4) 下面是 Swift 中基本的数据类型...

  • 从 0 到 1 认识从 0 到 1

    看了太多从 0 到 1 的标题了,总感觉那是在乱用流行的标题,记得这个标题是从阿里开始的,从 0 到 1 的书,活...

  • Swift从0到1(一):项目目录

    写在前面: 一个项目清不清晰:第一眼的看不是代码逻辑而是文件逻辑。 项目目录的搭建 简单看下我的项目物理目录: 注...

  • 从1到0,0到1。

    把经历过的一切事情都归零是件很难可以做到的事情,并不会像计算器那么简单。 有时候想,如果人的大脑能像机器那样多好,...

  • Swift 基本语法初窥

    Swift 基本语法 Simple Values 使用 let 定义常量,var 定义变量。常量的值虽然不必在编译...

网友评论

    本文标题:初窥Swift:从0到1

    本文链接:https://www.haomeiwen.com/subject/sqxesttx.html