swift学习(二)--基本运算符、字符串、集合操作

在这一篇博客里面,我想要介绍一下swift里面一些常用的基本运算符,还有涉及到的字符串,集合操作。你会发现在swift里面还是有许多其他语言所不具有的特性运算操作的。

首先最基本的+,-,*,/,>,<,>=,<=,==,!=,||,&&,这些最基本的运算符用法跟其他语言里面可以说是一模一样的,在这里就不想多做介绍了。让我们来挑一些特性的东东说一说吧!就拿%来开刀吧!你可能就想问了,求余运算符这有什么稀奇的,难道其他语言里面没有吗?是有的,但是在swift里面如果我们进行如下的操作:8%2.5会得到什么呢?之前一直没有注意这个问题,在swift里面我们会得到一个float类型的余数,在其他语言还没有测试过。

接下来让我们来说一说元组操作吧!比如:

var testTuple=(10,"xiao");

var testTuple2=testTuple;

我们是不是可以直接进行这样的赋值操作呢?如果可以的话,元组是进行值传递的呢?还是进行引用传递的呢?答案是元组是进行值传递的,所以我们进行上面的赋值操作的时候,得到的应该是一个复制的副本了。在swift里面我还发现如下运算符:“..”,"...",没错就半闭包运算符和闭包运算符,那么有什么区别呢?又是怎样使用的呢?

var index:Int;

for index in 1..10{

println(index);

}

我们会得到什么结果呢?如果我们进行如下操作:

var index:Int;

for index in 1...10{

println(index);

}

又会得到什么结果呢?答案是下面的操作会多输出一个10,说到这里我想你应该就明白了,闭包就是包括最后的那个元素,而半闭包则不包括最后的元素。

好了,让我们转到字符串这块了,首先我想说的一点就是:在swift里面String类型是值类型,是不是跟你在其他语言里面的认知观念有点不同呢?我们可以进行如下的测试进行验证:

var origionStr="xiao";

var newStr=origionStr;

newStr="cai";

println(origionStr);

println(newStr);

如果origionStr和newStr不相同的话,是不是就说String是一个值类型了,反之就是引用类型了。

在swift里面针对String类型操作,提供了很多有用的方法:isEmpty(判断字符串是否为空),hasPrefix(判断一个字符串的前缀),hasSuffix(判断一个字符串是否拥有某某后缀),uppercaseString(转换成大写),lowercaseString(转换成小写).在String里面还有一个有趣的东东,如下:

var testStr="xiaocai";

for codeUint in testStr.utf16{

println(codeUint);

}

这是干什么呢?其实这是获取testStr的16进制的遍历属性,当然8进制也是可以的。

好了,字符串就说到这里了,让我们来看一看集合操作吧!首先是数组(Array),我们可以有以下定义方式:

var testArray:String[]=["xiao","cai"];

var testArray2=["xiao","cai"];   //利用Swift提供的推断功能

var testArray3=Int[]();   //创建一个Int类型的数组

var testArray4=Array(count:3,repeatedValue:2.5);   //利用swift的推断功能,创建一个Double类型,长度为3,默认值为2.5的数组

var testArray5=Double[](count:3,repeatedValue:0.0);  //创建一个Double类型,长度为3,默认值为0.0的数组

当我们定义好一个数组,我们可以使用count属性访问数组的长度,还可以使用isEmpty判断数组是否为空。现在我们来想一个问题:如果我们想要在上面定义的testArray后面添加元素怎么办呢?我们可以使用append或者+=:

testArray.append("hello");  或者

testArray+="hello";  //添加单个元素

testArray+=["hello","world"]; //添加多个元素

上面这些方法都默认在数组的最后面添加元组的,那么在swift里面如果我想要在制定的索引上面添加元素应该怎么办?insert(atIndex:)方法可以很好的帮我们实现这个功能:

testArray.insert("hello",atIndex:1);   //在索引为1的位置插入一个元素

如果现在我们想要访问testArray里面的元素应该怎么办呢?可以直接使用索引:

var arrayValue=testArray[0];   //得到索引为0的值

testArray[0]="你好";   //修改索引为0的值

testArray[0...2]=["小蔡","学习","swift"];  //同时修改0,1,2索引出的数值

当我们建好一个数组之后,我们也可以调用:removeLast,removeAtIndex这两个方法移除元素,相信看到方法你也应该想到这两个方法有什么区别了吧!

好了让我们来讲一讲数组的遍历吧!你可能会觉得很小儿科,但是在swift里面相比较我们熟悉的一些语言在语法书写格式上面还是有一些区别的,如果现在我们想要遍历上面定义的testArray数组应该怎么做呢?

var item:String;

for item in testArray{

println(item);

}  //好吧,这是通常的做法,但是你有没有注意到for语句并没有括号,同时它使用的是类似于c#里面的foreach语言结构

让我们再来加加压,如果我在遍历的同时不止想要得到value,我还想要得到index应该怎么做呢?想想其他语言里面的做法,在c#里面,你应该会有如下的做法:

string[]  testArrayForCSharp={"hello","world","xiao","cai"};

for(int i=0;i<testArrayForCSharp;i++)

{

Console.Writeln(i+testArrayForCSharp[i]);

}

在swift里面将会更加的直接:

for (index,value) in enumerate(testArray){

println(index+value);

}

直接调用enumerate将数组拆分成index和value的元组,然后在元组里面我们就可以拿到index和value了。

好了,数组就说到这里了,让我们来看一看字典(Dictionary)吧!首先让我们来看一看在swift里面字典应该怎样定义呢?

var testDic=Dictionary<String,String>();   //创建一个空字典

var testDic2:Dictionary<String,String>=["key1":"value1","key2":"value2"];   //定义一个key为String类型,Value为String类型的字典

var testDic3=["key1":"value1","key2","value2"];   //利用swift的推断功能,定义一个key和value都为String类型的字典

下面让我们来想一想,在swift里面访问一个字典会怎么做呢?方法一:

testDic["Key1"]="hello";   //直接利用key来访问字典,并且修改value

方法二:利用swift提供的updateValue(forKey:)方法

testDic. updateValue("xiaocai",forKey:"key1");  //将key1位置的value修改为”xiaocai“

但是这个方法会返回一个可选的类型,这个时候我们需要利用可选绑定进行操作:

if let result= testDic. updateValue("xiaocai",forKey:"key1"){

println("Successed");

}

else {

println("failed");

}

还有removeValueForKey方法(移除指定key上面的value),也是返回一个可空类型,需要进行可选绑定。

接下来,让我们看一看应该怎样遍历一个字典呢?如果我们想要遍历上面定义的testDic,应该怎么做呢?

for (key,value) in testDic{

println(key+value);

}   //直接利用元组得到key和value,没有错跟上面数组的一种方式是一样的

如果我只想要得到testDic里面的key集合或者只想要得到value集合呢?

for key in testDic.keys{

println(key);    //得到key

}

for value in testDic.values{

println(value);   //得到value

}

let keyArray=Array(testDic.keys);   //直接获取key的数组,并将其赋值给另外一个常量

let valueArray=Array(testDic.values);  //直接获取value的数组,并将其赋值给另外一个常量

好了这一篇就讲这么多了,如果有时间的话,后续更新中(保留版权和著作权)。

上一篇:go在什么情况下使用指针


下一篇:C/C++ ceil和floor函数