Swift学习初步(一)

前几天刚刚将有关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学习初步(一)

时间: 2024-10-13 14:25:47

Swift学习初步(一)的相关文章

Swift学习之每日一tip (3)闭包

闭包介绍 最近在学习swift的过程中,发现很多人都对于swift的闭包有很深的疑惑,今天就以我个人学习swift 1.2版本下的一些经验进行一些分享,如有错漏,望大家指出. ps.<关于Swift学习之每日一tip>我这段时间会持续更新,而其中关于swift的内容都是在今年(2014)春节之后,苹果推出Xcode6.3测试版的之后推出的swift 1.2的语法,关于1.2与1.1的语法,我会在明天的内容中进行一下介绍. 通用闭包 首先,给大家写一段常见的闭包代码 demo{ (name) -

[转]swift 学习资源 大集合

今天看到了一个swift的学习网站,里面收集了很多学习资源 [转自http://blog.csdn.net/sqc3375177/article/details/29206779] Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简介 (@peng_gong) 一篇不错的中文简介 [译] Swift 首席架构师 Chris Lattner 简介(黄利民) Swift 背后的男人,他的个人主页. Swift 观点 如何评价 Swift 语言?(@知乎) 已有近 5000 人

swift 学习资源 大集合

今天看到了一个swift的学习网站,里面收集了很多学习资源 Swift 介绍 Swift 介绍 来自 Apple 官方 Swift 简介 (@peng_gong) 一篇不错的中文简介 [译] Swift 首席架构师 Chris Lattner 简介(黄利民) Swift 背后的男人,他的个人主页. Swift 观点 如何评价 Swift 语言?(@知乎) 已有近 5000 人关注该问题! [译] Rust 创始人 Graydon Hoare 对 Swift 的看法 (@CSDN) 无废话 Swi

Swift 学习-多线程

1:第一种多线程 func fun1(){ for i in 200...300{ NSLog("%d",i); } } func fun2(){ for i in 300...400{ NSLog("%d",i); } } var th1 = NSThread(target:self,selector:"fun1",object:nil); th1.start(); //开启线程 NSThread.detachNewThreadSelector

SWIFT学习笔记05

1.Swift 无需写break,所以不会发生这种贯穿(fallthrough)的情况.2.//用不到变量名,可用"_"替换 for _ in 1...power { answer *= base } 3.case 可以匹配更多的类型模式,包括区间匹配(range matching),元组(tuple)和特定类型的描述. 可以这样用case case 1...3: naturalCount = "a few" 4.如果存在多个匹配,那么只会执行第一个被匹配到的 ca

SWIFT学习笔记02

1.//下面的这些浮点字面量都等于十进制的12.1875: let decimalDouble = 12.1875 let exponentDouble = 1.21875e1 let hexadecimalDouble = 0xC.3p0//==12+3*(1/16) 2.//类型别名,用typealias关键字来定义类型别名 typealias AudioSample = UInt16 var maxAmplitudeFound = AudioSample.min 3.//元组 let ht

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

Swift学习笔记四:数组和字典

最近一个月都在专心做unity3d的斗地主游戏,从早到晚,最后总算是搞出来了,其中的心酸只有自己知道.最近才有功夫闲下来,还是学习学习之前的老本行--asp.net,现在用.net做项目流行MVC,而不是之前的三层,既然技术在更新,只能不断学习,以适应新的技术潮流! 创建MVC工程 1.打开Visual studio2012,新建MVC4工程 2.选择工程属性,创建MVC工程 3.生成工程的目录 App_Start:启动文件的配置信息,包括很重要的RouteConfig路由注册信息 Conten