Swift学习-基础的语法
2015-11-05 11:06
369 查看
励志作为iOS的开发人员,尽管写代码的时候不会专门的挑选Swift语言,但是肯定都会熟悉Swift这个名字,楼主表示从刚开始学习objc的时候就对Swift这个名字很感兴趣,感觉很高大上,但是从很多博客上也相应的看到相关文章,不得不说,Swift必将成为以后iOS开发的主流,尽管每次更新,Swift语言都会有比较大的更新,但不能代表就不了解他,闲话不多说,想了解Swift的历史可以去百度,今天聊聊关于Swift的那点小基础,这里如果有一点点C++/Java/PHP的基础的话,类比了解起来会更容易,毕竟Swift是集合了许许多多的语言的优点。
定义变量首先会有两个关键字 let (不可变)与 var(可变)
有什么区别呢,如其名字,let关键字定义的属性是不能修改的,var的变量是可以修改的,文字表述可能会比较无聊,代码来解释一下吧
那么变量名字后面的:以及后面的String是什么呢,Swift依旧保持特色,这就是他的定义变量的类型,stringBo:String 表示一个变量的名字叫做stringBo,类型是String
什么叫隐形呢,比如在objc中
这个样子在objc中允许,他会自动的将1转成YES,将0转成NO,但是Swift中上面的语法是错误的.如果想正确,必须变成显性的判断
通过一个简单的例子来看,写一个数组,如果里面有大于100的就返回true,否则返回false: Swift的Bool类型只有True或者False
首先定义一个数组
接着写一个用闭包完成的方法,用来完成该项功能
调用该方法
闭包相对于比较难理解点,不过结合Block会简单很多。
Swift 因为基础类型都有Array,Dictionary,String,且功能都比较强大,楼主有疑惑,什么时候用NSArray等对象,什么时候用array类型,如果有明白的人,麻烦请告诉一下楼主,十分感谢.
定义变量
首先第一步必然先熟悉如何定义变量,Swift语言楼主学的时间不是很长,基本是靠类比进行学习的,所以语言不是很准确,以后有更深的了解,必然会在这里修正定义变量首先会有两个关键字 let (不可变)与 var(可变)
有什么区别呢,如其名字,let关键字定义的属性是不能修改的,var的变量是可以修改的,文字表述可能会比较无聊,代码来解释一下吧
var stringBo:String = "RunIntoLove";//后面的引号可以不加,Swift允许,但是楼主比较习惯了 let string1Bo:String = "Run"; //进行修改值 stringBo = "Yue"; string1Bo = "Yue";//会出现报错-Cannot assign to value:'stringBo' is a 'let' constant ,就是说不能改变他的值,因为他是一个let类型的变量
那么变量名字后面的:以及后面的String是什么呢,Swift依旧保持特色,这就是他的定义变量的类型,stringBo:String 表示一个变量的名字叫做stringBo,类型是String
var stringBo = "RunIntoLove";//Swift会自动的根据后面的类型,判断stringBo的类型,所以可以不写类型 var string1Bo:String; //这样子是定义了一个字符串String类型的变量 var int1Bo:Int = 10;//这样子是定义了一个整型Int类型的变量 var string2Bo;//这里会报错,如果不直接赋值,那么后面的类型是不可以忽略的,会报错-Type annotation missing in pattern 类型描述缺少类型
数字型:Int,Double
在Swift中的类型开头都是大写的,不同于C/C++,但这也不影响使用,毕竟objc的风格也是如此,这里只说一下他的特点//数字 var u:Int = 00010_000_000;//var u = 10000000 || var u = 10_000_000.0 这三种写法是一样的 var d:Double = 10.2; var o = Double(u) + d;//在Swift中,不同类型的属性不能进行运算,要想进行运算,必须强制转换成相同的类型,这个时候o的值就是10000010.2
字符串:String
字符串在Swift中的用法更加灵活,比如两个字符串连接,只需要用"+"连接即可,这点是综合了C++/Java的用法,毕竟是好处嘛var firstName:String = "RunInto" var lastName:String = "Love" //字符串的连接 var name:String = firstName + lastName
元组:
元组是Swift中比较新的类型了,但是第一次看到元组的时候比较亲切,后来想了想第一次接触元组是在大学中的离散数学,它是一种能够存多种值的结构,这东西不需要定义类型,就能存储多种数据,但是有很好用,语言不能表达,为什么会有元组呢,因为Swift的函数是可以有多个返回值的,接收的时候自然会用元组来接收,用代码更好的说明下://定义元组 var postion = (name:"YueWen",age:22);//定义一个元组,这种定义法类似一个结构体 var person:(String,Int) = ("YueWen",22);//可以提前声明类型 var (z,m) = ("yuewen",18);//通过元组给其他元组赋值 var point2 = (name:z,age:m); //取值 var name_1 = postion.name//与name_1 = postion.0等价 var age_1 = postion.age//与age_1 = postion.1等价 var name_2 = person.0//通过小标进行取值,类似与数组了 var age_2 = person.1
语句控制
if...else
在Swift的if-else语句中,不同的还是有的,它不允许在()里进行隐形判断,必须是显性的。什么叫隐形呢,比如在objc中
NSInteger i = 1; if(i)//如果i为真,报错-Type'Int' does not conform to protocol 'BooleanType' { //coding.. }
这个样子在objc中允许,他会自动的将1转成YES,将0转成NO,但是Swift中上面的语法是错误的.如果想正确,必须变成显性的判断
var number:Int = 1; if(numbe1 == 1)//如果number = 1 { //coding... }
for循环
for循环没有什么较大的改动,依旧有最基础的,也有for-in循环,如下//定义一个数组 var numberArr = [90,85,47,52,36,"123"]//这里数组比较特别,里面的数据不仅限于一种类型,比如这里的数组存的就是Int类型的数据以及String类型的数据 //循环遍历 for s in numberArr { print("number = \(s)")//在iOS_9.0之后,print替换了println,println已经被废除,写的话会报错 } //普通for循环 for (var i = 0; i < numberArr.count; i++)//Swift中调用方法废除了[],选用了. 这点与大多数的编程语言相同了 { var s = numberArr[i] print("打印出的变量为\(s)")//print 代替 println,打印的形式只需要加一个\(需要打印的内容)即可 }
do-while循环 - repeat-while循环 iOS9之后用repeat替换do
依旧通过便利上数组来举例//do while循环 var k = 0 repeat//iOS9.0之后用repeat代替了do { var s = numberArr[k] print("do while 循环打印出的变量是\(s)") k++ }while(k < numberArr.count)
while循环
//while循环 var k1 = 0; while(k1 < numberArr.count) { print("while 循环打印出的变量是\(numberArr[k1])"); k1++ ; }
Switch语句
switch语句变动还是比较大的,因为在objc以及其他的语言中,每次case完毕之后都需要在后面加一个break,不然会穿透到下一个case语句,但是在switch语句中,不需要加break,默认不穿透,需要穿透的事后只需要加 fallthrough 关键字即可//switch let iso = "iOS" switch iso//switch后面的变量可以使字符串,不仅仅只限于数字了 { case "iso": print("iso 为 iOS") //break 可以省略,swift不穿透 //穿透需要加 fall through,加上这一句就是说执行完这句话之后会继续执行case:"Android" case "Android": print("iso 为 Android") case "JS": print("iso 为 JS"); default: print("最后了") }
函数
函数形式发生了变化,声明方法以及函数,用func关键字,返回值不再存在与函数之前,而是用放在 ’ -> ‘之后,如果返回值为Void,可以省略无返回值无参
func testFunction() { print("测试方法!") }
有一个参数没有返回值
//带参的函数 func testFunction(s:String) { print("参数是\(s)") }
如果想真正的修改参数值,用inout关键字
这句话是什么意思呢,就是说当做参数放到函数中,无论在函数中对该参数进行任何的操作,原来的实参是不变的,加上inout关键字就相当于C语言的指针,C++的引用&,里面对参数的更改实际上就是修改的实参func testFunction0(inout s:String)//表示实参可以改变,改变之后参数也会发生变化,类似C++的引用 { s = "Run"; print("参数是\(s)") } var s:String = "RunIntoLove"; testFunction0(&s);//在执行完毕这一句话之后,s就变成了Run
带多个参数,无返回值
//带多个参数的函数 func testFunction(s:String , i:Int) { print("我的参数是\(s),\(i)") } testFunction("RunIntoLove", i: 5)
返回一个返回值的函数
//返回值函数 func testFunctionF(v1:String, andVaule v2:Int, andNumber v3:Int) ->String//逗号不要丢 { return "\(v1)\(v2)\(v3)" } var string = testFunctionF("RunIntoLove", andVaule: 10, andNumber: 8) print("返回值参数是:\(string)");//返回值参数是:RunIntoLove108
返回多个返回值的函数
//无参 返回3个值,但是需要用一个元组接收 func testFunction123() ->(String ,String ,String) { return ("RunIntoLove","Study","Swift") } //用元组接收 var (name1,action,target) = testFunction123() print("\(name1) \(action) \(target)");//RunIntoLove Study Swift
函数嵌套函数-一般人不建议用
//函数嵌套函数 func testFunctionInFounction() -> Int//返回值类型为Int { var y134:Int = 100 //方法可以嵌套方法 func add() { y134 += 5 //可以用外部的变量 y134++ //变量与++之间不能有空格,不然编译器会报错 } //执行方法 add() return y134 } var number12 = testFunctionInFounction() print("number12 = \(number12)")//number12 = 106
闭包_Closure-objc的Block
如果之前了解了objc的Block代码块就很好理解了,就是说在参数的位置放置一个函数,将方法的函数当做一个参数来用通过一个简单的例子来看,写一个数组,如果里面有大于100的就返回true,否则返回false: Swift的Bool类型只有True或者False
首先定义一个数组
var arrInt = [80,12,45,789,85,63,110] //定义一个数组
接着写一个用闭包完成的方法,用来完成该项功能
func hasClosureMatch(arr:[Int],value:Int,function:(num:Int, value:Int)-> Bool) ->Bool//参数的方法参数有两个,一个数字,一个参考数字,返回值为bool, 外部大的方法的参数为 一个Int型的数组,参考值,以及一个闭包 { //开始遍历数组 for item in arr { //使用参数中的函数 if(function(num:item, value:value)) { return true } } return false }
调用该方法
//定义个方法,查找arr里面是否有比100大的数 var v1 = hasClosureMatch(arrInt,value:100,function: { (num:Int,value:Int) -> Bool in return num >= value //当该数字num大于参考值value的时候返回sure,否则返回false })//打印结果为ture,因为110大于100
闭包相对于比较难理解点,不过结合Block会简单很多。
Swift 因为基础类型都有Array,Dictionary,String,且功能都比较强大,楼主有疑惑,什么时候用NSArray等对象,什么时候用array类型,如果有明白的人,麻烦请告诉一下楼主,十分感谢.
相关文章推荐
- Openstack - cinder与swift、glance的区别
- 如何在xcode中上使用OC无缝调用Swift
- 如何用Swift实现一个好玩的弹性动画
- Swift下去除Navigationbar下方的横线
- swift学习Day02
- Swift 编程思想 Part 4:map all the things!
- Swift 中函数的用法
- Swift中的!和?
- Swift的结构体,枚举,可选Optional,可选链
- swift中的字符串的一些运用
- Swift的可选的和可选链
- Swift枚举代码
- swift 快速奔跑的兔几 本节的内容是:绘画第二讲~
- Swift学习笔记
- Swift学习:闭包(Closures)
- Swift(九、枚举)
- 详解Swift编程中的方法与属性的概念
- swift UIAlertController教程
- 深入解析Swift编程中枚举类型的相关使用
- 详解Swift语言中的类与结构体