我对swift的第一印象
print("Hello,World!")
众所周知,每个程序员每接触新的一门语言,必将最先学会这一句经典:Hello,World! 世界上的第一个程序就是Hello World,由Brian Kernighan创作。。这个例程在Brian Kernighan 和Dennis M. Ritchie合著的《The C Programme Language》使用而广泛流行。swift当然也是如此的亲切,让我花了2秒的时间就与她有了交集。
一见钟情
Swift不需要引入头文件或写在main()内,也不需要在每一句加上分号(当然,若你保有使用某些其他语言的习惯,如Java、C等 加上分号结尾亦不会报错)。
Swift强大的类型推断
推断类型使代码更干净,不易犯错误,而模块消除了头,并提供命名空间。内存自动管理,而你甚至都不需要输入分号。
var myVariable = 42
myVariable = 50
let myConstant = 42
上面的myVariable会被swift推断为Int类型。
总的来说,在刚接触这门陌生的语言的时候,她的各种优点吸引了我,让我对学习这门语言有了很浓厚的兴趣。
swift对我的第一印象
愚蠢,呆萌,反应迟钝
当然,作为一个业余的初学者程序员,程序的道路并不是一帆风顺的,而耐心是我唯一的资产。每当遇到错误的时候,只有把程序一个一个的小红叉都pass掉,才能让程序正常运行,就像你必须给一个对象买到她想要的东西,她才回对你做出你想要的事(别yy)
swift好在你还去给她买东西的时候,只是选好了还没付钱,她就告诉你有些是错的,她不想要,这时你还可以换些别的,这就是swift的严密语法和强大的类型推断。只要你有耐心,细心一点,一定会运行出理想的功能。
约会后的短时间相处
The First Week
鱼儿已上钩,二话不说,直接进入主题:
渐渐的,模拟器成了我和swift的桥梁,每个程序的结果,都直观的在模拟器上体现出来:
首先声明,这不是肾6,这是像我这种穷屌一样的开发者的福音:simulator(模拟器),每个app的运行都通过这个来实现。
第一周摸爬滚打
经过第一周的特别练习,让我们从初学者的角度轻松的完成了简易的app,由浅入深,了解了swift的一些基本语句结构,以及Xcode工具中控件的应用以及整体布局,视图美化等.
1.通过做牛眼睛游戏的过程,学会了点击按钮触发警告框提示结果:
let alertcontroller = UIAlertController(title: "警告", message: "系统温度过高", preferredStyle: .Alert)
let okAction = UIAlertAction(title: "ok", style: .Default, handler: nil)
alertcontroller.addAction(okAction)
self.presentViewController(alertcontroller, animated: true, completion: nil)
2.生成1-100的随机数
number = Int(arc4random_uniform(100)) + 1
3.字符串插值 在字符串中插入一个变量或者常量的值(var)
print("\(a) + \(b) = \(a + b)")
print("\(a) - \(b) = \(a - b)")
print("\(a) * \(b) = \(a * b)")
print("\(a) / \(b) = \(a / b)")
print("\(a) % \(b) = \(a % b)")
// Swift中加减乘除运算的左右两边类型必须一致
4......
The Second Week
第二周细嚼慢咽
开始了正式了解swift这门语言的漫漫长路,从swift的基本属性到结构特征,由浅入深,层层逼近。
常量,变量,基本类型,函数,元组,循环结构,数组...一看就是很专业的样子,果断津津有味的学习起来。变量常量不多说,以后的程序中都会用到,非常重要。值得提的是,swift里面,阿猫阿狗都可以作为一个变量,let cat = "🐱"; print(cat)!是没有任何问题的。
标示符
命名规则
- 字母(Unicode字符)、数字、下划线,数字不能开头
- 大小写敏感
- 不能使用关键字做标识符
- 驼峰标识 - 第一个单词全小写以后每个单词首字母大写
- 见名知意
基本类型
正常情况下,整数首选Int,小数首选Double,表示字符串首选String 表示真假用Bool类型
var b:Int8 = -128
print(Int.max) //2^63-1
print(Int.min) //-2^63
print(Int8.max) // 2^7-1
print(Int8.min) //-2^7
print(Int16.max)//2^15-1
print(INT16_MAX)//-2^15
print(Int32.max)//2^31-1
print(Int32.min) //-2^31
var e : UInt8 = 255 //无符号 整形,只能是正整数
print(UInt8.max)
print(UInt8.min)
var f:Float = 1.235444
var g:Double = 1232.0
数据的输入
利用c 语言,可以进行数据的输入
- 新建一个C file ,创建桥接头文件,在input.c 中定义变量:
- 在input.h 文件中声明变量:
- 在桥接头文件中,导入函数定义文件:
- 在main.swift中调用输入函数,即可对控制台输入的变量进行运算操作:
print("a = ", terminator: "")
let a = inputInt()
print("b = ", terminator: "")
let b = inputInt()
**元组(tuple) **
- 用一个变量或者一个常量保存多项数据信息的类型
let stu: (id: Int, name: String, gender: Bool, age: Int) = (1001, "王大锤", true, 23)
print(stu.0)
print(stu.1)
print(stu.2)
print(stu.3)
print(stu.name)
print(stu.age)
let (j, _, _, k) = stu
print("j = \(j)")
print("k = \(k)")
元组还有个非常强大的功能,交换数据,简单粗暴:
// 用元组交换两个变量的值
(x, y) = (y, x)
三元运算符
三元条件运算的?前面一定要加空格!!!
let msg = username == "admin" && password == "123456" ? "登录成功!!!" : "非法用户!!!"
顺便一提,在做应用的时候,一定要考虑到用户的体验效果 。比如,应用的运行速度,UI外表等等,一个小小的改变,可能就会让用户对你的应用感兴趣,比如,在登陆页面,键盘的控制就显得交互感十足了,如果点击屏幕任何位置,键盘就会自动隐藏:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
// 触摸屏幕任意位置隐藏虚拟键盘
if usernameField.isFirstResponder() {
usernameField.resignFirstResponder()
}
else if passwordField.isFirstResponder() {
passwordField.resignFirstResponder()
}
}
循环结构
循环结构很容易崩溃,所以需要必要的断点调试。调试(debug) - 在怀疑出问题的代码处设置断点,程序会执行到断点处停下来 然后使用单步执行并观察,程序中所有的变量常量等的值来找到出问题的代码。
循环结构有三种:
- for循环
for _ in 1..<10 {
print("Hello, world!")
}
- repeat-while循环 - 至少执行一次
var i = 1
repeat {
print("\(i). Hello, world!")
i += 1
} while i <= 100
- while循环 - 有可能一次都不执行
var i = 1
while i <= 10 {
print("\(i). Hello, world!")
i += 1
}
利用这三种循环语句,适当的搭配分支语句,就可以解决一些实际问题了
- 猜数字游戏
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
游戏截图
- 求阶乘
print("n = ", terminator: "")
let n = inputInt()
var val = 1.0
var i = 2
while i <= n {
val *= Double(i)
i += 1
}
print("\(n)! = \(val)")
- Craps赌博游戏
两个骰子,玩家摇,第一次摇出7,11点,玩家胜,第一次摇出了2,3,12点庄家胜,如果摇到其他的,玩家继续第二轮摇,如果第二轮摇到7,庄家胜,如果摇到的数和第一轮相同,玩家胜,摇到其他的,玩家继续重复摇。。。
func roll()->Int{
return Int(arc4random_uniform(6))+1
}
var money = 1000
repeat{
print("your money is \(money)")
var debt:Int
repeat{
print("please make a bet:")
debt = inputInt()
}
while debt<=0||debt>money
var firstnum = roll()+roll()
var isneedsgoon = true
print("first number is \(firstnum)")
switch firstnum {
case 7,11:
print("you win")
money+=debt
isneedsgoon = false
case 2,3,12:
print("you lose")
money-=debt
isneedsgoon = false
default :
isneedsgoon = true
}
while isneedsgoon{
var currentnum = roll()+roll()
print("next,you roll a \(currentnum)")
if currentnum == 7{
print("you lose")
money -= debt
isneedsgoon = false
}
else if currentnum == firstnum{
print("you win")
money += debt
isneedsgoon = false
}
}
}
while money > 0
print("your money is not enough")
- 百钱百鸡
典型的利用循环语句来穷举法,非常的实用:
一百块钱,要买100只鸡,公鸡5元一只,母鸡3元一只,小鸡1元三只,买鸡的方案为:
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):(\(x),\(y),\(z))")
}
}
}
结果:
(x,y,z):(0,25,75)
(x,y,z):(4,18,78)
(x,y,z):(8,11,81)
(x,y,z):(12,4,84)
- 利用循环语句打印图案
var row = 5
for _ in 1...5{
for i in 1...5{
print("😝",terminator:"")
}
print(" ")
}
print("")
for i in 1...5{
for j in 1...i{
print("😡",terminator:"")
}
print("")
}
for m in 1...5{
for n in 0...5-m{
print("😂",terminator:"")
}
print("")
}
let hang = 7
for i in 0..<hang{
var starnum:Int
var spacenum:Int
if i <= hang/2 {
starnum = i*2+1
}
else {
starnum = (hang-i)*2-1
}
spacenum = row - starnum/2
for l in 0..<spacenum{
print(" ",terminator:"")
}
for l in 0..<starnum{
print("😎",terminator:"")
}
print("")
}
数组
同一类型的数据的集合,可以是int ,string,double,bool....
- 创建数组
var array1 = [String]()
var array2: [String] = []
var array3 = ["apple", "grape", "banana", "apple", "orange"]
var array4 = [String](count: 100, repeatedValue: "")
array3[2...4] = ["eggplant", "cucumber"]
for (index, value) in array3.enumerate() {
print("\(index). \(value)")
}
- 向数组中添加元素
array1 += ["strawberry"]
array1.append("pear")
array1.insert("waxberry", atIndex: 0)
array1.insert("watermelon", atIndex: 2)
array1.insert("lemon", atIndex: array1.count)
- 数组的+运算
let array7 = array1 + array3//前提是两数组的类型相同
- 从数组中删除元素
array1.removeAtIndex(2)//删除第三个元素
array1.removeFirst()//删除第一个元素
array1.removeAll()//删除所有元素
- 数组的复制
var array5 = array3 //全部复制
array5[0] = "pitaya" //复制第一项
var array6 = array3[1...3] //复制第2.3.4个元素
- 获取数组元素个数
print(array1.count)
- 对数组中的元素进行遍历
for index in 0..<array3.count {
// []是对数组进行下标运算(取出指定位置的元素)
print(array3[index])
if index == 1 {
array3[index] = "litch"
}
}
- 数组的应用:
1.简单排序
var index = 0
print("排序前:")
var array = [87,55,26,33,47]
print(array)
for p in 0..<array.count {
var maxindex = p
for a in p+1..<array.count{
if array[a]>array[maxindex]{
maxindex = a
}
}
(array[p],array[maxindex]) = (array[maxindex],array[p])
}
print("排序后:")
print(array)
2.冒泡排序
设第一个数最大,将最大的数一次与数组中的数比较,如果还有比最大数大的,就交换位置,依次循环。
var mpArray = [60,70,65,12,91,33]
print("排序前:")
print(mpArray)
var iswhat = false
for i in 0..<mpArray.count-1{
for j in 0..<mpArray.count-i-1{
if mpArray[j]>mpArray[j+1]{
(mpArray[j],mpArray[j+1]) = (mpArray[j+1],mpArray[j])
iswhat = true
}
}
if iswhat == false {
break
}
}
print("排序后:")
print(mpArray)
说在后面的情话
经过接近半个月的接触,不断的触碰这门语言,已经对这门语言有种无法自拔的感觉,只想继续学下去,天,我是爱上她了吗?
成长记录册
-
前两周