Swift学习总结

Swift学习总结

现在学习Swift这门语言也两周了,也算开了个头了,刚开始学习可能对以前有过其它语言学习经验的人来说不是很习惯,但是慢慢入门了,习惯了它的开发环境和语法结构也就会好很多。那现在我就总结一下我这两周的学习内容吧。

一、Swift学习环境

1.首先你要有一台装有OS-X系统的电脑
2.再然后就是下载Swift开发工具X-code,我们现在用的是7.2版本
3.一切就绪之后就可以新建一个工程了

屏幕快照 2016-08-06 上午9.22.43.png

现在我们建的ios应用,那么就选中图上的(ios Application),然后选择单视图应用( Single View Application),当然如果你要做其它类型的应用你可以选择其它os-X\tvOS等等


屏幕快照 2016-08-06 上午9.35.29.png
屏幕快照 2016-08-06 上午9.28.46.png

上述工作做完之后,点击next进入如下界面。第一项为项目名称,最好用全英文;第二项组织、公司名称;第三项公司或个人网站域名,倒着写,如果你的app上线,那么这就是它的唯一标识,其它的我想也不用过多介绍了。

屏幕快照 2016-08-06 上午9.35.29.png

这些都搞完之后点next,下个页面选择创建项目的储存路径,整个工程就完成了。

二、Swift语法

1.基本语法

标识符的命名规则

  1. 字母(Unicode字符)、数字、下划线,数字不能开头
  2. 大小写敏感
  3. 不能使用关键字做标识符
  4. 驼峰标识 - 第一个单词全小写以后每个单词首字母大写
  5. 见名知意

2.数据类型

1.Int类型(整型)
分为Int和UInt(无符号整型),有8位,16位,32位,64位,当然Int 和UInt取值范围是不一样的。

print(Int8.max) // 2^7-1
print(Int8.min)// -2^7
print(UInt8.max) //2^8-1
print(UInt8.min) //0

2.浮点数Float和Double
Float(单精度浮点数)表示32位浮点数、Double(双精度浮点数)表示64位浮点数

123 = 1*10^2 + 2*10^1 + 3*10^0
x = 101     // 十进制
print(x)
 5 = 1*2^2 + 0*2^1 + 1*2^0
x = 0b101   // 二进制(binary)
print(x)
65 = 1*8^2 + 0*8^1 + 1*8^0
x = 0o101   // 八进制(octal)
print(x)
 257 = 1*16^2 + 0*16^1 + 1*16^0
x = 0x101   // 十六进制(hexadecimal)
print(x)
用科学计数法表示小数
y = 1.23e4
print(y)    // 12300.0
y = 1.23e-4
print(y)    // 0.000123

3.Bool类型
布尔类型只有两种值,即true和false。
4.字符串类型
"Hello,world!"

正常情况下表示整数首选Int,表示小数首选Double,表示字符串首选String,表示真假首选Bool

3.常量和变量

用let定义常量,用var定义变量;常量和变量可以用字母、下划线、数字命名,但是不能已数字开头。

let constA: Double = 2.25
print(constA)
var varB:Float
varB = 3.14159
print(varB)

4.运算符

Swift中运算符由算术运算符、关系运算符、短路运算符、赋值运算符、位运算符等组成。
1.算术运算符
+、-、*、/、%
==算术运算符两边数据类型必须一致;整数除以整数不会有小数部分;整数除以0产生运行事异常,小数除以0可能的结果是inf/-inf/nan==
我们还经常会用到字符串插值:

print("\(a) + \(b) = \(a + b)")

print("\(a) - \(b) = \(a - b)")```
2.关系运算符
  <、 > 、<=、 >=、 ==、 !=
3.短路运算符
&&(短路与)、||(短路或)、!(非)
4.赋值运算符
简单赋值运算符:=
复合赋值运算符:+=、-=、*=、/=、%=
5.三元条件运算符
c = a < b ? a : b(如果a<b为true则c = a,否则c = b)
###5.分支结构
if 语句
if else语句
if...elseif...else 语句
switc...case语句

###6.循环结构
while 循环(有可能一次都不执行)
repeat...while...循环(至少执行一次)
for 循环

下面介绍几个利用循环-分支结构解决问题的实例
1.水仙花数 - 153 = 1^3 + 5^3 + 3^3
//找出100-999之间所有的水仙花数
//作用域: 变量或常量只在定义它的花括号中起作用
//GET:变量或常量的作用域越小越好
//GET:能用常量的地方就不使用变量(编译器会优化代码)

func cube(n: Int) -> Int{
return n * n * n
}
for a in 100...999{
let c = a / 100 //百位
let d = (a % 100)/10 //十位
let f = a % 10 //个位
if a == cube(c) + cube(d) + cube(f){
print(a)
}
}

2.猜数字

let answer = Int(arc4random_uniform(100)) + 1
var thyAnswer: Int
var counter = 0
repeat{
counter += 1
print("请输入你猜的数字:",terminator: "")
thyAnswer = inputInt()
if thyAnswer > answer
{
print("小一点")

}
else if thyAnswer < answer{
    print("大一点")
}
else {
    print("恭喜你猜对了!你总共猜了\(counter)次")
}

} while thyAnswer != answer
if counter > 7{
print("你的智商该充值了!")
}

3.Craps赌博游戏

func roll() -> Int{
return Int(arc4random_uniform(6)) + 1
}
var money = 100000
repeat{
print("玩家总资产: ¥(money)元")
var debt: Int
repeat{
print("请下注:", terminator: "")
debt = inputInt()
}while debt <= 0 || debt > money
var needsGoon = false
let firstPoint = roll() + roll()
print("玩家摇出了(firstPoint)点")
switch firstPoint {
case 7, 11:
print("玩家胜!")
money += debt
case 2, 3, 12:
print("庄家胜!")
money -= debt
default:
needsGoon = true //游戏继续
}

while needsGoon{
    let currentPoint = roll() + roll()
    print("玩家摇出了\(currentPoint)点")
    if currentPoint == 7{
        print("庄家胜!")
        money -= debt
        needsGoon = false
    }
    else if currentPoint == firstPoint {
        print("玩家胜!")
        money += debt
        needsGoon = false
        
    }
}

}while money > 0

print("你破产了!!!")

4.百钱买百鸡

GTE:穷举法(穷尽所有的可能性直到找到正确答案)
for x in 0...20{
for y in 0...33{
let z = 100 - x - y
if 5 * x + 3 * y + z / 3 == 100 && z % 3 == 0{
print("公鸡:(x),母鸡:(y),小鸡:(z)")

    }
}

}

5.打印菱形

print("row = ",terminator: "")
let row = inputInt()
for i in 0..<row{
//通过行号计算出星星的数量和空格的数量
//先打印空格再打印星星就可以了
let star: Int
let space: Int
if i <= row/2 { //上半部分
star = 2 * i + 1
}else{ //下半部分
star = 2 * (row - i) - 1
}
space = (row - star)/2
for j in 0..<space{
print(" ",terminator: "")
}
for j in 0..<star{
print("*",terminator: "")
}
print("")
}



![屏幕快照 2016-08-06 上午11.58.34.png](http://upload-images.jianshu.io/upload_images/2670573-d20291119ef835b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
###5.数组
1.数组的定义和初始化
创建数组的方法很多,下面介绍这几种:

var array1 = Int
var array2:[Int] = []
var array3 = [99,12,34,166,7]
var array4 = [Int](count: 100, repeatedValue: 1)

2.获取数组元素个数

print(array1.count)
print(array2.count)
print(array3.count)

3.对数组中的元素进行遍历

for i in 0..<array3.count{
//[]是对数组进行下标运算(取出指定位置的元素)
print(array3[i])
if i == 1{
array3[1] = 520
}
}
print(array3)
//只读循环(在循环过程中不能修改数组元素)
for str in array7{
print(str)
}

//用元组索引
var array7 = ["apple","orange","banana"]
for (index, value) in array7.enumerate(){
print("(index). (value)")
}



![屏幕快照 2016-08-06 下午2.09.14.png](http://upload-images.jianshu.io/upload_images/2670573-c4d54c8c8a690d4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4.向数组中添加元素

var array5: [String] = []

array5.append("strawberry")
array5.append("pear") //追加
array5 += ["eggs"]
array5.insert("waxberry", atIndex: 0)
array5.insert("watermelon", atIndex: 2)
array5.insert("lemon", atIndex: array5.count)//插入
print(array5)



![屏幕快照 2016-08-06 下午2.13.36.png](http://upload-images.jianshu.io/upload_images/2670573-13db84c22e82baf6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

var array5 = ["waxberry", "strawberry", "watermelon", "pear", "eggs", "lemon"]
array5.removeAtIndex(4)
array5.removeFirst()
print(array5)
array5.removeAll()
print(array5)

6.数组的复制

var array7 = ["apple","orange","banana"]
var array9 = array7
array9[0] = "pitaya"
print(array9)
var array10 = array9[1...2]
print(array10)
let array11 = array9 + array5
print(array11)


例1//用数组输出斐波拉契数列

var fibArray = [Int](count: 20, repeatedValue: 0)
fibArray[0] = 1
fibArray[1] = 1
for i in 2..<fibArray.count{
fibArray[i] = fibArray[i - 1] + fibArray[i - 2]
}
//1.
for (index,value) in fibArray.enumerate(){
print("(index + 1).(value)")
}
//2.
for i in 0..<fibArray.count{
print(fibArray[i])
}
//3.
for num in fibArray{
print(num)
}

例2:简单选择排序:每次从剩下的元素中找最小的元素放到对应的位置上

for i in 0..<array.count - 1{
var minIndex = i
for j in i + 1..<array.count{
if array[j] < array[minIndex]{
minIndex = j
}

}
(array[i],array[minIndex]) = (array[minIndex],array[i])

}
print(array)

例3:冒泡排序:

for i in 0..<array.count - 1{
var swapped = false //当前这轮没有发生过两两交换
for j in 0..<array.count - 1 - i{
if array[j] > array[j + 1]{
(array[j],array[j+1]) = (array[j+1],array[j])
swapped = true
}
}
//没有发生过两两交换则终止循环
if swapped == false{
break
}
}
print(array)


##三、App制作
由于开发过程细节较多,这里举一个简单的例子来介绍可视化开发过程:
1.首先你要建一个ios application的工程,工程建好后,工程文件夹是这样的


![屏幕快照 2016-08-06 下午2.40.33.png](http://upload-images.jianshu.io/upload_images/2670573-b2bc09a7d70ce826.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.我们在Main.storyboard(主故事板)目录构建app用户界面
比如我们要做一个用户登录的界面,如下图:


![屏幕快照 2016-08-06 下午2.46.19.png](http://upload-images.jianshu.io/upload_images/2670573-c376c58c65d8d0c4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
首先点击屏幕上方的ViewController打开属性检查器,调整size即屏幕尺寸,最右上那三个框可以打开左右和底部边栏。然后点击对象库,选中你需要添加的对象,拖动到屏幕上就添加到用户界面上了,现在我们添加的是两个text(文本框)和一个按钮(button)。
3.添加完毕后打开辅助编译器,如下图:


![屏幕快照 2016-08-06 下午3.08.35.png](http://upload-images.jianshu.io/upload_images/2670573-ec451a70fc9fd2fa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

根据图上的方法,把对象拖到右边松开ctrl键是这样的


![屏幕快照 2016-08-06 下午3.16.01.png](http://upload-images.jianshu.io/upload_images/2670573-0092f66b3ffe8788.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
点击connection,可以展开几个选项text就选Outlet,button选择Action,将三个对象都添加完毕后就可以在相应对象代码里面写事件代码了。

import UIKit

class ViewController: UIViewController {
override func viewDidLoad() {
}
@IBOutlet weak var admin: UITextField!
@IBOutlet weak var password: UITextField!
@IBAction func loginButton(sender: AnyObject) {
//自动去掉文本框里的空格
admin.text = admin.text!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
let userName = admin.text!
let passWord = password.text!
//三元条件运算符
let msg = userName == "admin" && passWord == "123456" ? "登陆成功!" : "非法用户!"
let alertController = UIAlertController(title: "温馨提示", message: msg, preferredStyle: .Alert)
let loadAction = UIAlertAction(title: "确定", style: .Default, handler: nil)
alertController.addAction(loadAction)
self.presentViewController(alertController, animated: true, completion: nil)
}
//一触摸屏幕就执行函数
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if admin.isFirstResponder(){
admin.resignFirstResponder()
}
if password.isFirstResponder(){
password.resignFirstResponder()
}
}
}

4.在模拟器上运行效果

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

推荐阅读更多精彩内容

  • 数据类型 内置数据类型 Swift 提供了非常丰富的数据类型,以下列出了常用了集中数据类型: Int 一般来说,你...
    阳明先生1208阅读 198评论 0 0
  • 关于 Swift 重要这个文档所包含的准备信息, 是关于开发的 API 和技术的。这个信息可能会改变, 根据这个文...
    无沣阅读 4,285评论 1 27
  • 【一】 这篇文章酝酿了很久,因为每天早...
    於年阅读 181评论 0 1
  • 光阴荏苒。母亲今年已经五十多岁了,随着时间的流逝,母亲的美丽像落花散落一地,同时也散失了梳妆打扮的闲情逸致。她的...
    岳凡阅读 358评论 0 1
  • 在睡眼惺忪的早晨,或是慵懒小困的午后,很多人会选择来一杯咖啡提提神。每当路过街角的咖啡店,也常常会被咖啡那难以抗拒...
    基因空间阅读 838评论 0 0