swift 笔记(一)—— 基础

来源:互联网 发布:linux怎么删除文件 编辑:程序博客网 时间:2024/04/29 01:14
开篇     
     今天凌晨随着 iOS8的发布,苹果还推出了研发多年的swift语言,不管将来它会发展得如何,做为脚本语言,swift集合了 python, lua, C#, java, Objective-C等语言的众多特性,对于iOS本身的开发,可以说是件好消息,让原本被Objective-C吓倒的一些人,又可以重新爬回到iOS的开发来了,可以让iOS市场,更加繁荣。(感谢 swift技术交流第一平台(355277)的群友 夕颜(1651150754) 指出swift并不是脚本语言 )

     接下来直接进入正题,Swift的林林总总,官方已经给出了链接,完全是为了以后翻查,所以一一简单的记录在这里。(官方介绍:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097-CH3-XID_0)

Swift基础

常量和变量
let myConstantVar = 10
myConstanceVar = 1 //[编译错误]

var myVar = 100
myVar = 1 //[OK]
let用于声明常量, var用于声明变量

var myX = 1, myY = 2, myZ = 3
支持 连续的变量声音和赋值
支持 连续的变量声明和赋值(感谢 swift技术交流第一平台(355277)的群友 夕颜(1651150754) 指出错别字 )

如果需要指定变量的类型,用“:”
var myIntVar: Int = 1
var myStringValue: String = “hi~”  //这里可以看到,去掉了oc里那个2B的“@”符号,好顶赞

官方给出了个变量名的例子,看完我笑尿了:


可以看到,中文和表情,都是可以做变量名的,而这里的表情,不是图片,其实是Unicode,所以支持中文也就并不奇怪了

对于格式化字符串的支持,苹果又出淫技:
var myInt: Int = 3
var myString: String =  “ Hi, the var myInt value is \(myInt)” //中二进行中 \( ) 竟然不是对称的,苹果你又淫了

也可以直接输出:
println(“ Hi, the var myInt value is \(myInt)”)

注释
高兴的发现,这次 Swift给我们带来了可以嵌套使用的多行注释,再也不用像C语言里面那么2B了
/*注释2
/*注释1*/
注释2继续*/
经过测试,写在一行是可行的,如:/* 注释2 /*注释1*/ */

单行注释上面已经有了,跟C里无异

分号
上面的代码已经看到了,不需要分号,当然也可以用分号把多行代码写在一行上
println(“line 1"); println(“line 2")

数据的大小
swift支持 8,16,32,64位的数据格式,也支持有符号(signed)和无符号(unsigned)类型
Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64 等等
当然,正常情况下,不需要指定数据的大小,它会根据系统是32位平台还是64位平台自己选择数据的大
在32位机上,Int的大小就是和Int32一样,在64位机上 Int的大小就是和Int64一样
PS:如果需要做跨平台项目的话,那么还是指定数据的大小比较好,不然在不同平台上可能会出现编译出错的问题(数据不会溢出,编译器限制了这个问题)

想获取数据的大小,也很容易,可以使用 Uint8.min Uint8.max 等方式获得 无符号8位整型数的最小值和无符号8位整型数的最大值,当然其它位数的数据,也是同样的写法

关于浮点数:
Swift的 Float是32位的,Double是64位的。

如果在给一个数值型变量赋值的时候,其实我们不愿意告诉编译器是什么类型的数据,它也会自动创建相应类型的变量:
let myPi = 3.14159  //自动创建一个叫myPi的Double型变量,而不是Float
let myInt = 2  //自动创建一个叫myInt的Int型变量
let myMixVar = myPi + myInt  //自动创建myMixVar为Double型

let myCannotBeNegative: UInt8 = -1    //编译出错
let myTooBig: Int8 = Int8.max + 1         //编译出错

增强数据可读性
为了增强长数字的可读性, swift引入了”_”下划线做为分隔符,比如:
let myPaddedMillion = 1_000_000      //等同于 let myPaddedMillion = 1000000, 免去了我们数有多少个0的麻烦

数值的前缀
let myDecimalInteger = 17                   //十进制数不需要前缀
let myBinaryInteger = 0b10010            //二进制数前面用 0b 表示
let myOctalInteger = 0o35                    //八进制数前面用 0o 表示
let myHexadecimalInterger = 0x1F3    //十六进制数前面用 0x 表示

数据类型转换
对于不同数据长度的类型,在一起操作的时候,我们需要用强类型转换表示,如:
let myUInt16Value: UInt16 = 2_000
let myUInt8Value: UInt8 = 1
let myResult = myUInt16Value + UInt16(myUInt8Value) //因为myUInt8Value是 UInt8类型,所以不能直接操作,需要强制转换才可以进行操作

对于不同类型的转换,还要注意数据可能会被截断, 如:
let myPi = 3.14159
let myIntPi = Int(myPi) //此时 myIntPi 的值是3注意,这里不是四舍五入,是直接被截断

类型别名typealias
Swift为类型别名专门创造了个关键字:typealias
typealias MyUInt = UInt
此时的MyUInt已经不再是变量名,他就是UInt的另外一个名字了,我们可以通过MyUInt操作那些UInt能做一切操作,如:
let myVar: MyUInt = 2_000
let myVar: UInt = 2_000 
两句是一样一样的
也或者可以用 MyUInt.max得到UInt.max一样的结果
因为操作MyUInt实际上就是在操作UInt

布尔
true/false

但是,不能像C/C++里用法,不能用非0值表示true,而一定要用Bool值来判断,比如:
let i = 1
if i {…} //臣妾做不到啊啊啊啊。。。

但是你要是写成 if i == 1 {…} 就可以 //但这么写的是2B

元组(Tuples)
用一个()把两个值括起来的玩意,就叫Tuples,到底应该译成什么呢。。。其实它更应该叫pairs(好基友)才对啊,比如:
let http404Error = (404, “Not Found”)
此时,http404Error就是一对基友的代名词,可以通过很多种方法得到每一只基友的值:
http404Error.0  //小受 他的值是404
http404Error.1  //小攻 他的值是 “Not Found"

或者定义成
let http404Error = (statusCode: 404, description: “Not Found”)
http404Error.statusCode  //刚才那小受改名叫 statusCode了
http404Error.description   //刚才那小攻改名叫description了

也可以
let (justTheStatusCode, _) = http404Error //用来忽略第二只基友
此时 justTheStatusCode的值就是小攻了

发现这里其实是多元组(尽管官方的例子里只给了两个),可以写成群P的:
let myTuples = (1,2,3,4,5,6,7,8,9,0)

可选项(Optionals)
自objective-c中的nil不能用于对象来判断,非常恶心的创建了个nil对象,来判断之后,苹果再使淫招—可选项(非正常人类研究中心最近因项目资金问题,一直没有请到看门大爷),看例子:
let myNumber = “123”
myNumber.toInt() 会得到”123”对应的数值,但如果
let myNumber = “Hello kitty”
myNumber.toInt() 怎么描述呢?如果是在C/C++里面就直接崩溃给你看了,可是苹果不想(那你返回个nil不就完了吗), Swift引入了一个新概念,说这个值可能是个数值,也可能不是个数值,所以这个值用”Int?”来表示,而不是”Int” (我已经崩溃,系统重启中)

这个“可选项”还用在了很多地方,后面还会一一遇到,比如
let myString: String? = “Hello miao” //myString表示的是他可能是个字符串,也可能不是个字符串,尼玛到底是不是字符串呢,无从得知。其实如果他不是的话,会变成nil值的,参考下文的 [nil值] 部分

如果使用了一个Optionals变量的时候,你确定他的值是有效的而不是nil的时候,可以使用”!”来标榜 I Knew it!!!
比如刚才的 myNumber.toInt()的值,你有足够的信心确定他真的不是个nil(谁知道呢)的话:
println (“ myNumber’s value is \(myNumber.toInt()!)”)  //当然,如果你 knew错了,程序会在跑得很欢的时候崩溃给你看,小心使用!

一般会这样使用”!”:
if let myActualNumber = myNumber.toInt()
{
     println(“myNumber’s value is \(myActualNumber!)”) //“!”用在这里的话,是肯定不会出错了
}
else
{
     println(“myNumber could not be converted to an integer")
}

nil值
仅仅用于optional变量中
var myInt: Int= 1
myInt = nil

var myInt: Int?  //这里没有赋值的话,myInt会自动赋值为nil
至此,关于”?”的迷团终于告一段落(呼~)

! 和 ? 到底怎么用
上一篇提到的optional 感觉很乱,很纠结,而且今天晚上跟群友解决一个问题,用了三个小时,也是和这东西有关,新引入的特性,我们还并不了解很多,暂时先总结为:
当我们确定一个optional变量不为nil的话,那么可以使用!告诉编译器,这里不要再提醒我了,我确定他是可用的,编译器会通过检查,但是,如果错误的使用了!,那么就会在运行时发生错误!

let myNumString = “123”
let myNum = myNumString.toInt()  //我们制造了一个optional变量 myNum
println(myNum!)  //使用!表明:我知道他不是nil

当我们知道他必然不是nil的时候,比如上面这个例子,也可以写成:
let myNumString = “123”
let myNum! = myNumString.toInt() //这里使用!表示 myNum一定不是nil
println(myNum)     //对于编译器来讲,这里完全可以不用管myNum到底是不是optional了

上面这个例子是个常量,后面不会被改,好像也还算凑合,但是,可能会发生这样的情况:
let myNumString1 = “123”  //myNumString后面是数字1
let myNumStringl = “abc”    //myNumString后面是字母L的小写
let myNum! = myNumStringl.toInt()  //这里误用了第二个变量,也就是字母L小写的那个变量
println(myNum)     //嗯,它会崩溃给你看的!

当然,可能我们会想,谁这么2B才会起这样的变量名,可是在实际项目中,多人合作,难免会有这样的情况发生,这还是常量的情况,如果是变量呢? 呵呵。。呵呵。。
所以,还是老老实实的把这个特性用好吧,贪小便宜吃大亏。

断言(Assertions)
断言是个好东西,在调试的时候用起来超爽,可以找出非常妖娥子的bug。
断言函数 assert(exp: Bool[, str: String])的第一个参数是个Bool表达式,当表达式为true的时候,什么都不会发生,而当表达式为false的时候,程序就会崩溃, 第二个参数是个字符串(可选),以提供在程序崩溃时提供有用信息。

let age = -3
assert(age >= 0, “A person’s age connote be less than zero”)
这里assert就会起作用,因为age >= 0这个表达式是false

也或者
assert(age >=0)  //忽略字符串提供信息, 傻子都知道这样偷懒就是给自己找麻烦


什么时候使用断言?其实如果项目经验多的话,都该知道的。
什么数组边界检测啊(下标是不是越界), 指针是否可用啊, 函数传进来的参数是否合法啊(当然,如果你是写库程序的,这里就不能assert),等等等等。。。


0 0
原创粉丝点击