Swift简单入门教程

简述

 自从苹果2014年发布Swift,到现在已经两年多了,而Swift也来到了3.1的版本。最近利用工作之余,整理了一份简单的入门教程。

1.首先,作为一个程序员,大家第一想到的是“Hello,World”,下面阐述OC和Swift中分别是怎样实现展示“Hello,World”。

OC:NSLog(@"Hello,World");
Swift: print("Hello,World")

通过上面两个,我们就能清楚的知道,在Swift中,这行代码就是一个完整的程序,我们不需要为了输入输出或者字符串处理导入一个单独的库,全局作用域中的代码会被自动当做程序的入口点,不需要main函数,也不需要在每个语句结尾写上分号。
在这里顺便插入一个Xcode的Playground,这是一个简单易用的代码预览功能,在左侧输入代码,右边立马能展示效果。

Playground

简单值 let 和var

   使用let申明常量,var申明变量,常量我们只能为它赋值一次,编译的时候我们并不需要获取,可以使用多次,但是不能再次被赋值。变量是在程序运行过程中,多次被赋值的量。
let myPlaygrounWidth = 20
var myChangeWidth = 30
myChangeWidth = 40

常量或者变量的类型必须和你给它们的值保持一致,但是,你可以不用明确地声明类型,如果在声明的同时赋值的话,编译器会自动推断类型。例如如下语句:

var age = 10
let string = "myString"

根据所赋的值,编译器会自动推断age为整型,string为字符串(String)类型,但是你也可以显式指定类型:
let myString:NSString = "This is String"
但是值永远不会隐式转换其他类型,如果你需要一个值转换成其他类型,必须显式转换。

let testView = "The Height is"
let height = 80
let testViewHeight = testView + String(height)

当你取消那个String时候就会报错:不会隐式转换其他类型
let testViewHeight2 = testView + height

图2

当然有一个更方便的转换字符串的方法:右斜杠(值)
let testViewHeight3 = "testView + \(height)"

数组和字典

数组

   数组在一个有序链表存储了多个类型相同的值,同一个值可以在数组的不同位置多次出现。Swift的数组对它们能存储的值的类型是明确的,不同于OC中NSArray和NSMutableArray,OC数组能存储任何类型的对象,并且不提供关于这些对象自身的任何信息,在Swift中,任何一个特定的数组所存储的值,类型总会被确定下来,要么显式说明,或者通过类型推断。如果你创建了一个Int类型数组,你就不能存储任何非Int类型的值插入数组。

1.数组的创建

var gameStringArray = ["one","two","three"]
var gameShowArray:[String] = ["stringOne","stringTwo","stringThree"]
var gameArray = ["one","two","three",1](会报错)
var gameInteArray:[Int] = [1,2,"string"](会报错)
数组类型有误

因为当你显式的决定了数组的值的类型就不能再插入其他非这指定类型的值,但是当并非显式决定时候可以后面添加as[Any]泛指各种类型,如下所示:

var gameArray = ["one","two","three",1] as [Any]

2.数组的存取和修改
数组的取值还是和OC差不多,可以通过索引取值
gameStringArray[1] gameStringArray[2]
当你数组越界时候会提示报错如下所示:

数组越界

数组的简单add、insert、remove和OC差不多,只是语法的不同,如下所示:

var gameStringArray = ["one","two","three"]               //["one", "two", "three"]
gameStringArray.append("addString")                       //["one", "two", "three", "addString"]
gameStringArray.insert("insertString", at: 1)            //["one", "insertString", "two", "three", "addString
gameStringArray.remove(at: 2)                           //"two"
print(gameStringArray)                                  // "["one", "insertString", "three", "addString"]\n"

你也可以一次性修改指定范围的值,即使将要替换掉的元素的数量和将要替换成的元素的数量不一样,也都可以正确使用,如下所示:
gameStringArray[1...3] = ["changeString","ChangeString2"] //"["one", "changeString", "ChangeString2"]\n"

字典(Dictionary)

字典是一种存储多个类型相同的值的容器,每个值都和一个唯一的Key(键)相对应,这个key在字典中就是其对应值的唯一标识,和数组不同,字典里的元素没有顺序。Swift的字典对它们能存放的键和值的类型是明确的。这不同于Objective-C的NSDictionary类和NSMutableDictionary类,Objective-C的字典能存储任何类型的对象作为键或值,并且不提供关于这些对象自身的任何信息。在Swift里,任何一个特定的字典键和值,其类型总会被确定下来,或者通过显式的类型说明,或者通过类型推断

1.字典的初始化

var dictionary = ["Ch":"China","DB":"Dublin"]
var showDic:Dictionary<String,String> = ["Ch":"China","DB":"Dublin","test":"\(1)"]   //假如直接写1会报错,显式决定了类型

2.字典的存取和修改

dictionary["Ch"]                      //"China"  如果字典有就是取值
dictionary["Ch"] = "Chinese"          //修改value
print(dictionary)                     //"["DB": "Dublin", "Ch": "Chinese"]\n"
dictionary.updateValue("Ch", forKey: "Updata")  //拥有key就是修改 没有就相当于添加
dictionary.removeValue(forKey: "Ch")   //移除  当字典中没有这个key时候为nil  但是在OC中会报错闪退

数组和字典的可变性

 数组和字典都把多个值存放在一个集合里。如果你创建了一个数组或者字典,并且将之指定为变量,那么该集合就是可变的,这意味着在集合被创建后,可以通过增加或删除元素来改变集合的容量大小。相反地,如果你指定一个数组或字典为常量,那么该数组或字典就是不可变的,其容量大小不能被改变。
 对字典来说,不可变还意味着你不能改变字典里某个键的值。一个不可变的字典一旦被设置值后,它里面的内容就不能再改变。
 但是,数组的不可变性跟字典略有不同。尽管你不能进行任何可能会改变数组大小的操作,但是你可以给数组中的某个索引设置一个新的值。这使得Swift的数组在大小固定的情况下能够达到最佳的性能。

控制流

 使用if和switch来进行条件操作,使用for-in、for、while和do-while来进行循环

1.for循环 在相对OC来说 Swift的功能强大,慢慢弃用了C语言的
for (<#initialization#>; <#condition#>; <#increment#>) { <#statements#> }
Swift For循环如下所示:

var nameArray = ["张三","李四","王五","赵六"]
for string in nameArray {
    print(string)
}
for index in 1..<10 {
    print(index)
        // 打印结果为1-9
}
for index in 1...10 {
    print(index)
    //打印结果为1-10
}
for index in nameArray.reversed() {
    print(index)
    //打印结果相反 倒序
}
for (index,i) in nameArray.enumerated() {
    print(index)  //遍历索引
    print(i)      //遍历元素
}

2.if else
在if语句中,条件必须是一个布尔表达式——这意味着像if score { ... }这样的代码将报错,而不会隐形地与 0 做对比。
你可以一起使用if和let来处理值缺失的情况。这些值可由可选值来代表。一个可选的值是一个具体的值或者是nil以表示值缺失。在类型后面加一个问号来标记这个变量的值是可选的。具体写法和OC差不多,少了条件的括号

var score = 50
if score > 20{
}else
{
    score += 1
}

3.while

var x = 2
while x < 10 {
    x = x + 2
}
var m = 2
repeat {                        //do 改成了repeat
    m = m * 2
} while m < 10

函数和闭包

//定义一个传入两个String返回为String的函数
func test(name:String,eat:String) ->String{
    return "Today\(name)eat \(eat)"
}
//函数调用
test(name: "张三", eat: "ice")

//定义一个传入key 和value 返回一个字典的函数
func redictionary(key:String,value:String) -> Dictionary<String,String>
{
    var dic = [String:String]()
    dic[key] = value
    return dic
}

//函数调用
print(redictionary(key: "myName", value: "Hou"))
var myDic:Dictionary<String,String> = redictionary(key: "myTest", value: "Test")

//函数的参数是可变的,可以不传,也可以多个(求平均数)
func getAverage(numbers:Int...) -> Float
{
    var sum = 0
    let count = numbers.count
    for number in numbers {
        sum += number
    }
    let result = sum / count   
    return Float(result)
}
print(getAverage(numbers: 12,22,33))

未完待续,如有错误麻烦指点一二

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容