前几天刚刚将有关oc的教程草草的看了一遍,发现oc其实也不像传说的那么难。今天又开始马不停蹄的学习Swift因为我很好奇,到底苹果出的而且想要代替oc的编程语言应该是个什么样子呢?看了网上的一些中文教材之后,才发现原来swift真的是太灵活,相比较之前oc语言真的是有天壤之别了。随着学习的深入,我发现自己真的喜欢上了swift,鉴于网上的教程还不是太多的缘故,我就萌生了将自己的一些学习体验写成一系列博客的想法,如果有什么不全面的地方欢迎大家来拍砖。
首先我来说说自己对于swift的第一印象吧!那就太灵活了,比如你要定义一个变量aa或者常量bb的时候,在c#里面你就需要首先知道aa/bb到底是什么类型,假如是整形的话,你会写成int aa=0;注意每条语句的后面你还需要加上一个分号,这在很多语言里面都有这个要求吧!诶,但是在swift里面你就不需要这么的麻烦了,对于变量你直接使用var关键字,对于常量你直接使用let关键字,并且在定义之前你也不需要知道该变量到底是什么类型,你所要做的就是给它赋个初始值就可以了,像var aa="cai"(当然语言后面可以加,也可以不加分号),swift就可以自己推断出当前这个aa变量是String类型的。是不是很智能呢?是不是有点脚本语言的感觉呢?是不是很像动态语言呢?别急它还有更多的惊喜呢?且看下面的这段代码:
var test="hello world";
var number=10;
var result=test+String(number);
var result2="hello world\(number)"
我现在如果问你result和result2会不会产生一样的结构呢?为什么呢?答案是它们的结构是一样的,这就是swift里面的有一个新的特性:\()可以直接将一个常量或者变量放在字符串里面输出。这只是swift新特性里面的冰山一角呢?别急,且听我慢慢道来,让我们试想这样一个问题:在其他语言里面如果要定义一个字典类型的话,你会怎么做呢?在c#里面的解决方案就是:
Dictionary<string,string> testDic=New Dictionary<string,string>();
testDic.Add("key",value);
我们首先需要去创建一个字典实例,然后再一个一个的往里面添加key和value。那么这个问题如果放在swift里面会怎么做呢?
var testDic=["key1":value1,"key2":value2]; (这条语句定义之后swift就推断出当前的testDic是一个字段的变量)
是的,就是这样的简单明了。key和value之间利用“:”分割开来,然后不同的键值对之间通过“,”分割开来,这个时候你可能会问如果我想要某个键里面的value,我应该怎样做呢?也是很简单的:
var keyValue1=testDic["key1"];
只要通过对应的key取出value就可以了,如果我想要在前面定义的testDic字典变量里面在增加一个键值对应该怎么做呢?如下:
testDic["keys"]="value3";
好了,说到这里面你可能已经忍不住想要自己试一试了,别急,让我们再来提出一个问题:如果你想要定义一个空的数组,或者空的字典类型,你会怎么做呢?想想你自己熟悉的语言吧!但是在swift里面却只要:
var testArray=[]; //定义一个空的数组
var testDictionary=[:]; //定义一个空的字典类型
你会疑问这样就可以了吗?是的,这样就足够了,剩下的就留给swift自己去推断吧!
好了,经过这个几个小问题,你可能会觉得swift确实挺强大,但是再强大也是从基础开始的,下面就让我们从头来看一看swift里面的一些基础部分吧!
首先是变量/常量的定义,想想你自己熟悉的语言,你会怎么做呢?在Swift里面,你只需要如下:
var testBL=10; //定义一个变量
let testCL="hello world"; //定义一个常量
var testBL1=10.0,testBL2=10,testBL3="xiaocai"; //同时定义多个变量也是可以的,就像其他语言一样快捷
如果你能够知道所要定义的变量或者常量的初始值的话,那么就尽量给它们初始值吧!这样你就不需要过多的考虑当前变量或者常量的类型,直接赋好初始值让swift自己去推断吧!但是有的时候你暂时还不知道自己所要定义的变量的初始值到底是什么?这个时候你应该怎么去定义呢?如下:
var testWithOutValue:Int;
let testWithOutValue2:String;
这种情况下,你需要在定义的变量名称后面加上“:”,然后是变量类型(Int,String),说到这里让我们顺便提一下swift里面一些常用类型吧!包括如下:
Int,String,Bool,Array,Dictionary,Double,Float,nil(这个在oc里面表示一个空指针,但是swift里面就是空类型,仅此而已)
在swift里面还特地提供了两个属性用来或者每种类型的取值范围呢,分别是:min,max,有的时候我们可能需要进行类型强转,这个时候在swift里面应该怎么处理呢?如下:
var testInt=10;
var testString="xiao";
var testResult=testString+String(testInt);
没有就是在所要转换的类型前面用括号括起来加上强转的目的类型就可以了。这里面提一点有趣的事情:
var testBigNumber=1_000_000_000_000;
这种在中间加上下滑线的大整形,swift能够识别吗?答案是yes,这就方便我们处理一些大数据了。我记得在c#里面有个类型别名的做法,那么在swift里面我们应该怎么做呢?
var myInt=Int; //这样就相当于给Int类型去了一个别名了,后面如果你想要定义自己的整形就可以使用myInt了。
println(myInt.min);
var testMyInt:myInt; //定义一个Int类型
好了,让我们再将一个swift里面一个很牛逼的类型元组(tuples),首次看到的话,你可能会问这是什么东东呢?让我们来假设这样一种场景吧!在你打开浏览器的时候,因为网络原因,你可能在访问网页的时候看到了404。如果我说光是一个404我可能不知道到底是什么意思,我要你在程序里面将不同code利用说明文字一一对应起来,这个时候你会怎么做呢?在c#里面你最可能想到的办法就是定义一个字典对象keyValue的形式。那么在swift里面我们应该怎么做呢?其实跟字典差不多,但是定义,访问的方式就有很大的差别了。
var http404Tip=[404,"Not Found"]; //定义一个说明元组
http404Tip.0; //访问元组里面第一个元素
http404Tip.1; //访问元组里面第二个元素
var (statusCode,statusVlaue)=http404Tip;
println(statusCode+statusValue); //直接利用值绑定的方式访问
如果我只对code感兴趣的话,我可以这样做:
var (statusCode,_)=http404Tip; //下划线就相当于一个占位符的意思
println(statusCode);
在swift里面我看到一些c#的影子,为什么这么说呢?请看下面的例子:
var testOption:Int?=10;
println(testOption!);
这两行代码是在干什么呢?首先第一行代码是在定义一个可选的Int类型,就跟c#里面的可空类型一样。然后第二行代码又是在干什么呢?后面为什么会有个!号呢?这就是在说到底testOption会不会为nil呢?你给我去解析一下,强制swift做解析。但是这样做其实是很危险的,因为当解析为空的时候,会出现异常。那么遇到这种情况的话,我们应该怎样去处理呢?我们可以利用swift里面提供的可选绑定的方式,如下:
if var testOptionResult=testOption{
println("parse success");
}
else{
println("parse failed");
}
如果强制解析成功的花,进入if里面,如果解析的过程发现是nil进入else,这样就可以很好的处理上面的异常问题了。在swift里面还有个隐式解析的过程,如下:
var testYS:String!="xiao cai";
println(testYS);
我们在定义变量的时候,就声明了一个带感叹号的String类型,输出的时候我们就不需要强制解析了。
好了,让我们在来说一下本篇博客的最后一个知识点,那就是断言。在swift里面定义一个断言如下:
var age=-3;
assert(age>0,"Big Zero");
只有当age>0为true的时候,程序才继续执行,否则进入断言里面输出“Big Zero”提示信息。
Swift学习初步(一)