Swift超基础语法(基础篇)

常量

定义常量的方法

  • 我们先看一下最完整的定义常量的书写格式:
    let 常量名称 : 常量类型 = 初始化值;
    例:
    let name : String = "lyu";
    let age : Int32 = 18;
    ...
  • Swift中的类型推导(不是推倒,别激动):
    如果在定义变量(或常量)的同时进行赋值(即完全初始化),那么变量(或常量)的类型可以省略,并且Swift会根据我们的赋值推导出变量(或常量)的类型,如下:
let n = 10 //实际上,现在这个n已经有了明确的类型int
  • 定义常量的快捷方法:
    Swift中如果一行中只有一句代码的时候允许省略末尾的分号;,再加上Swift的类型推导让我们定义常量变得更加便捷,如下
    let 常量名称 = 初始化值;
    例:
    let name  = "lyu"
    let age = 18
拓展:
Swift是一个强类型的语言,它的任何一个标识符都必须有明确的类型,如果一个变量(或常量)没有明确的数据类型则编译报错,如下:
错误写法:
let height //系统无法推导height的数据类型
正确写法:
let height : Int32 

变量

定义变量的方法

  • 依旧先看一下最完整的定义常量的书写格式:
var 变量名称 : 变量类型 = 初始化值;
例:
var name : String = "lyu";
var age : Int32 = 18;
...
  • 定义变量的快捷方法:
    原理与定义常量相同,如下:
var 变量名称 = 初始化值
例:
var name = "lyu"
var age = 18
...
  • tips:
    • 建议初学者优先使用常量进行定义,当明确某一个常量需要修改的时候,在将其定义为变量
    • 常量的本质是指向的内存地址不可以修改,但是当我们通过内存地址拿到一个实例化对象的时候,是可以通过内存地址来修改对象的内部属性的,例如:
let view : UIView = UIView(); //实例化对象
view.frame = CGRectMake(100, 100, 100, 100); //虽然view是一个常量,但是我们仍然可以修改它指向的对象的属性
错误写法如下:
view = UIView(); //无法使view指向一个新的对象

对象

实例化对象的方法

什么?实例化对象要先写new?要alloc+init?你out了,Swift中实例化对象非常之简单,我们简单看两个例子:

例1 view:
//下面简单介绍三种创建UIView的方法
let view : UIView = UIView() //相当于java中的new
let view : UIView = UIView.init(frame : CGRectMake(1,1,1,1)) //相当于OC中的initWithFrame
let view : UIView = UIView(frame : CGRectMake(1,1,1,1)) //相当于OC中的initWithFrame
//修改属性
view.alpha = 0.8 
view.backgroundColor = UIColor.redColor() //随意修改一些属性值,但是Swift中取消了smallTalk机制,一并换成了.点语法
//实例化UIButton对象的方法,对比其Swift中枚举值的两种写法
let button : UIButton = UIButton(type: UIButtonType.Custom) //枚举值写法的改变(枚举类型.具体类型)
let button : UIButton = UIButton(type : .Custom) //枚举值的简便写法
//修改button的属性
button.setTitle("按钮",forStatus: .Normal) 
//将button添加到父控件
view.addSubview(button) //添加控件
例2 controller:
let VC : UIViewController = UIViewController()
let navigationController : UINavigationController = UINavigationController(rootViewController:VC) //初始化rootViewController

实例化对象的方法大致如此

Swift的基本数据类型

这里大致介绍一下整型,以后有机会再补充吧...

Int8   : 有符号8位整型(相当于C语言中的char)
Int16 : 有符号16为整型(相当于C中的short)
Int32 : 有符号32为整型(相当于C中的int)
Int64 : 有符号64为整型(相当于C中的long)
Int     : 默认,与平台相关(例如:OC中的NSInteger)
UInt8   : 无符号8位整型(相当于C语言中的unsigned char)
UInt16 : 无符号16为整型(相当于C中的unsigned short)
UInt32 : 无符号32为整型(相当于C中的unsigned int)
UInt64 : 无符号64为整型(相当于C中的unsigned long)
UInt     : 默认,与平台相关(例如:OC中的unsigned NSUInteger)

基本运算

  • Swift中的数据类型没有隐式类型转换(*隐式类型转换是指在C/OC等语法中,int类型与double类型进行运算时,系统自动将int类型提升至double类型,再进行运算)
错误写法:
let a = 32
let b = 1.0
let sum = a + b  //编译报错
  • Swift中的类型转换:
数据类型(变量名)
如,上面反例的正确写法如下:
let a = 32
let b = 1.0
let sum = a + Int(b) //结果为33,整型
错误写法:
let sum = a + (Int)b //Swift与OC刚好相反,小括号要将变量括起来,而不是标识符

if逻辑分支

  • Swift中if语法的注意点
    • if后面的()可以写也可以不写,但是为了简洁开发,通常都不写
    • if的判断语句没有非0(非空)即真,也就是说if后面的判断语句必须有明确的真假
    • Swift中有明确的真假类型Bool,取值为ture或false,与java相同
    • if后面的{}必须写,与C或OC不同
例:
正确写法:
let age = 18
if age < 18{  //就算大括号中只有一句话,也不可以省略大括号
    print("未成年")
}
else{
    print("成年")
}
错误写法:
if age{} 
if 1{}
//if后面必须有明确的真与假,所以上面做死循环的方法不可取,死循环正确的姿势如下:
if age == 18{}

guard逻辑分支

Swift中的新型条件判断语句guard(守卫,名字屌爆有木有),旨在提高代码的可读性,取代if的多层判断,基本用法如下:

guard 条件语句 else{
结束语句  //break(switch或循环中使用)/continue(循环中使用)/return(函数中使用)
}
  • 语法解释:
    • 条件成立,则跳过else继续执行
    • 条件不成立,进入else执行代码,而else必须包含结束语句,用于跳出当前的循环或函数,这是为了保证后面的代码不执行
func ageIf(age : Int , sex : Int){
    guard age < 18 else{
        return
    }
    guard sex == 1 else{
        return
    }
    print("做我女朋友")
}
let age = 16
let sex = 1
ageIf(age, sex: sex)

keyMessage:guard多用在自定义函数或循环中

switch逻辑分支

重头戏来了,Swift中的Switch不再那么鸡肋,反而变得很强大,这点要与C和OC中区分开

  • Swift中Switch的基本用法:
    • switch后面的()可以写也可以不写
    • case结束后可以不加break,不会穿透
    • 如果想要执行穿透效果,需要在case结束后添加一条语句:fallThrough
    • case后面可以判断多个条件,多个条件需要以,分隔
例:
let sex = 1  //1:代表男 2:代表女
switch sex {
case : 0 , 1
print("正常人")
default:
print("不正常人")
}
  • 还没完呢
    • switch可以判断浮点型数据,字符串类型数据
switch option {
case "+":
    result = a + b
case "-":
    result = a - b
case "*":
    result = a * b
case "/":
    result = a / b
default:
    print("错误")
}
  • switch可以判断区间
Swift中支持的两种区间:
半开半闭区间:1..<10 表示数学中的:[1,9)
闭区间:1...10 表示 [1,10]
let age = 18
switch age{
case 0..<18:
    print("未成年")
case 18...30:
    print("青年")
default:
    print("老年")
}

for循环

  • for循环的几种写法如下:
    • for后面的小括号可以省略
for var i = 0;i < 10;i++{  //一般用于从后往前遍历,过期方法,不建议使用
    print(i)
}
  • 区间循环(做不到倒序遍历):
for i in 0..<10{  //此时的i被推导为int类型
    print(i)
}
  • 如果不需要i,可以使用下划线来替代
for _ in 0..<10{
    print("hello")
}

while循环与"新版doWhile"循环(repeatWhile)

while循环

  • 依旧可以省略while后面的()
  • 依旧没有非0即真和非空即真
错误写法:
while(1){}//报错
死循环的正确姿势:
while(1!=0){}

repeatWhile(doWhile)

  • while后面的()可以省略
  • 没有非0即真和非空即真
  • do换成了repeat
var count = 0
repeat{
    print("hello")
    count += 1
}while count < 10

字符串/数组/字典

相比于OC中的字符串/字典/数组,Swift统一去掉了NS

  • NSString改为String
  • NSArray改为Array
  • NSDictionary改为Dictionary
提示:
不要以偏概全哦:例如OC中的NSDate在Swift中仍然是NSDate...

字符串String

  • Swift中字符串的特点:
    • String是一个结构体,相对于对象(NSStrign)来说性能更高
    • String支持直接遍历
    • Swift提供了String和NSString之间的无缝转换
  • 创建字符串:
    • 可变字符串
let str = "hello"
  • 不可变字符串
var strM = "hello"
strM = "hello swift"
  • 字符串的使用
    • 遍历字符串
for character in str.characters {
            print(character)
        }
  • 获取字符串长度
let length = str.characters.count
  • 字符串的拼接
    • 字符串与字符串之间的拼接
 let str = "lyu"
let str2 = "sim"
let str3 = str + str2
print(str3)
  • 字符串与其他标识符之间的拼接
let name = "lyu"
let age = 18
let str3 = "name is \(name) and age is \(age)"
print(str3)
  • 字符串与其他标识符之间的格式化拼接
let str = "lyu"
let age = 18
let str3 = String(format: "name is \(str) , age is %i" ,age)
  • 字符串的截取
    • 使用Swift原生方法截取�
let urlString = "www.lyu.com"
//由于Swift中substringWithRange中的range泛型指定为Index类型,所以才导致创建区间如下面这般麻烦
let startIndex = urlString.startIndex.advancedBy(4) //创建区间起始
let endIndex = urlString.endIndex.advancedBy(-5)  //创建区间末尾
let range = Range(startIndex...endIndex)  //创建区间
let name = urlString.substringWithRange(range) //截取中间
let www = urlString.substringToIndex(startIndex)  //截取到...
let com = urlString.substringFromIndex(endIndex)  //从..开始截取
  • 使用OC方法截取
 let urlString = "www.lyu.com"
let name = (urlString as NSString).substringWithRange(NSMakeRange(4, 3)) //转换字符串,并使用OC方法来进行截取
let com = (urlString as NSString).substringFromIndex(8)
let www = (urlString as NSString).substringToIndex(3)

数组

  • 不可变数组:
let array = ["lyu","sim"]
  • 可变数组:
        var arrayM = Array<NSObject>() //不常见的写法,只因不够简洁
        var arrayM = [NSObject]()
  • 数组的基本操作(增删改查)
        arrayM.append("lyu")  //增加字符串
        arrayM.append(18)  //增加基本数据类型
arrayM.removeAtIndex(1)  //18被删除掉了
        arrayM[0] = "sim"
        arrayM[1] = "18"  //此例中,越界报错
let name = arrayM[0]  //取出数组的第0个元素
  • 数组的遍历
    • 普通for循环遍历:这种方法在Swift 3.0中即将被取消,请遗忘
let array = ["lyu" , 18]
        for var i = 0 ; i < array.count ; i++ {
            print(array[i])
        }
  • 增强for循环遍历:
 let array = ["lyu" , 18]
        for name in array {
            print(name)
        }
  • 超强for循环遍历:既能拿到index,又能拿到元素(简直碉堡)
let array = ["lyu" , 18]
for (index , name) in array.enumerate(){
        print(index)
        print(name)
}
  • 部分遍历:如果有只遍历数组中某部分元素的需求,那么就使用下面这种方法吧
let array = ["lyu" , 18]
for index in 0...1 {
        print(array[index])
}
  • 数组的合并
    数组的合并是有前提的:两个数组中对应index的元素类型必须一致,才能进行合并
正确写法:
        let array1 = ["name1" , 17]
        let array2 = ["lyu" , 18 , 19 , "sim"]
        let arrayT = array1 + array2
错误写法:
        let array1 = ["name1" , 17]
        let array2 = ["lyu" , "sim"]
        let arrayT = array1 + array2  //编译报错

字典

不可思议的是,Swift中的字典仍然使用[]来创建(而不是{}),Swift会通过[]中的内容来判断自己是一个字典还是数组(如果里面存放的是键值对,Swift会判定其为字典,如果里面存放的是元素,Swift会判定其为数组)

  • 不可变字典
let dic = ["name" : "lyu" , "age" : 18]
  • 可变字典
        var dicM = Dictionary<NSString , NSObject>() //不常用
        var dicM = [NSString : NSObject]()
  • 可变字典的基本操作
dicM["name"] = "lyu"  //第一种方法
dicM.updateValue(18,forKey:"age")  //第二种方法

keyMessage:如果key已经存在了,那么所谓的就变成了了哦

let name = dictM.removeValueForKey("age")  //Swift中被删除掉的元素是可以拿到的
dictM["name"] = "lyu"
dictM.updateValue("lyu",forKey:"name")
let name = dicM["name"]
  • 字典的遍历
    • 遍历key
for key in dic.keys {
            print(key)
        }
  • 遍历value
for value in dic.values {
            print(value)
        }
  • 遍历key/value:
for (key , value) in dic {
            print(key)
            print(value)
        }
  • 字典的合并:
    然而,字典并不能合并,就算元素类型相同也不可以,不过如果真的有让两个字典合并为一个字典的需求,可以这样做:
let dic = ["name" : "lyu" , "age" : 18]
var dicM = [NSString : NSObject]()  //将其中一个字典变为可变字典,作为被合并的字典
dicM["height"] = 1.80  //为可变字典添加属性
for (key,value) in dic {  //合并字典
        dicM[key] = value  
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容