您的位置:首页 > 移动开发 > Swift

swift语言入门介绍

2015-11-05 20:21 411 查看
1.
OC 的gcd、runtime是开源的,UIKIT是闭源的;
WWDC会议有对语言的新特性的讲解,维持一周,现在主推Swift语言。

2.

所有的声明和实现都在同一个文件中;

没有.h和.m文件。

3.

整数默认类型是int long
小数默认类型是double
(oc中的CGFloat 是单精度的)
数据的类型是自动推导的,能根据 ’=’ 右边的数据来确定具体的数据类型;
不同类型的数据无法直接进行计算,不支持隐含形式转换。
let修饰的数据一经赋值就不可修改,不可变。
var修饰的变量可变。
推荐使用let,安全,等需要修改的时候再改成var。

示例:

   
func
demo1 () {

       
var a = 10

        a = 12
       
let
b:CGFloat
= 11.1
       
//  b = 13 // b的值不可改变
       
let
c =
CGFloat(a) + b

       
print(c)

    }

4. 可选项 ?
fatal 致命的
unwrapping 强制解包
运算符需要加空格分开。
   
func
demo1() {
       
/*

        ?表示可选类型,简单理解为“有吗?” 有值就是具体类型的值,没有就是nil。
        打印可选项会带上
optaional。
         常报错:
        fatal error: unexpectedly found nil while unwrapping an Optional value
 
       格式:var a: Int?
       
在使用强制解包的时候,可能会有风险。
                如下示例,一旦a的值为nil,强制解包就会报错。
        */

       
var a:
Int? = 10

       
//
每使用‘!’

都要思考是否安全?
       
print(a!)

    }
5.分支结构
条件不用再写圆括号( )
大括号{ }不能省略
在swift语言中没有非零即真的概念,只有true 和false,好处是不用担心忘写非!
如:不用担心if(!dataList) 中忘写’!’。
6.if let 

if let 表示赋值,并且判断是否为空;

if
let
url =
NSURL(string: string){

       
let
request =
NSURLRequest(URL: url)

       
print(request)

    }

7.guard let … else

示例:

   
func
demo4(){

       
let
string =
"http://www.baidu.com?username=zhang"

       
// guard let
可以减少嵌套,增强可读性

       
guard
let
url =
NSURL(string: string)
else{

//            //

无法直接访问到url

//            print(url)
           
return

        }

       
//
程序走到这里一定有值
       
print(url)

    }

8. ?? 

所有可选项都不能直接参与运算。

   
func
demo5(){

      
var
a: Int? = 10

       
// >>快速判断是否为空,并且设置默认值
       
//
实际运用在获取数据源的个数,用的非常多
       
//
??运算符优先级较低
       
print((a ?? -1) + 11)

    }

9. switch 分支结构

   
/*

    1. break可以省略;

    2. case的条件中,至少有一段可以执行的代码,否则报错

    3.

case 中定义变量,不需要加
{ }

    4. case
的类型可以是任意类型,在c中只能是整型数据

    5. case

可以同时case多个条件

    */

   
func demo6(){

       
let i =
"100"

       
switch i {

       
case
"100","120":

           
let str =
"花花"

           
print("花无缺")

       
case
"200":

           
print("小鱼儿")

       
default:

           
print("其他")

        }

    }

10.循环

   
/*

   
仿OC循环

    1.循环的条件可以省略()

    2.递增的变量不能使用let

    */

   
func demo1(){

       

       
for
var i = 0;i<10;i++ {

           
print(i)

        }

    }

   
// swift循环,不包含10
   
func demo2(){

       
for i
in 0..<10{

           
print(i)

        }

    }

   
//

循环
包含10
   
func demo3(){

       
for i
in 0...10{

           
print(i)

        }

    }

   
// _表示忽略
   
func demo4(){

       
for
_
in 0..<10{

           
print("Hello World")

        }

    }

11. 字符串

   
/*

        OC
中的
NSString
继承自
NSObject
,是一个对象,效率略低,不支持遍历

        SWIFT
中的
String是一个结构体,更加高效,支持遍历

    */

   
func demo1(){

       
let str =
"花无缺"

       
for s
in str.characters{

        
print(s)

        }

       
// NSUTF8StringEncoding
是取字符编码的长度,中文的字符编码长度是3
       
let length = str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding);

       
print(length)
//
打印结果是9

       
let
l = str.characters.count

       
print(l)
//
打印结果是3

    }

   
func
demo2()

       
let
str1  =
"你若安好"

       
let str2 =
"便是晴天"

       
let str = str1 + str2

       
print(str)

       
print("\(str1)\(str2)")

       

       
let i:Int
= 10

       
print("\(i)便是晴天")

       
let j:Int? = 10

       
print("\(j)便是晴天")

    }

   
/*

       
你若安好便是晴天

       
你若安好便是晴天

        10便是晴天

        Optional(10)便是晴天

    */

   
//

字符串的比较

   
func
demo3(){

       
let
str1 =
"ye"

       
let str2 =
"liang"

       
if
str1 == str2{

           
print("ai")

        }else{

           
print("wo")

        }

    }

   
//

字符串和range

截取字符串
   
func demo4(){

       
//
将string

转换成NSString之后再去截取
       
let s1 =
"yuanlairuci"

       
let s2 = (s1
as
NSString).substringWithRange(NSMakeRange(4,
3))

       
print(s2)

    }

========================

12.数组的基本操作

 func
demo1() {

       
/*

        1.数组中不建议存放不同类型的对象

        2.let修饰的数组是不可变的

        3.

        */

       

var arr = ["wo","ni","ta"]

       

for str

in arr{

           
print(str)

        }

       
//
向数组中添加元素
        arr.append("she")

       
print(arr)

       
//
修改元素
        arr[0] =

"huawuque"

       
print(arr)

       
//
数组的删除
        arr.removeAtIndex(2)

       
print(arr)

        arr.removeFirst()

       
print(arr)

        arr.removeLast()

       
print(arr)

        arr.removeAll()

       
print(arr)

    }

   

//
数组的拼接

   

func demo2() {

       

let arr1 = ["ni"]

       
let arr2 = ["wo"]

       
let arr = arr1 + arr2

       
print(arr)

    }

13.字典的基本操作

   

//[key : value]键值对
   

func demo1() {

       
var dict = ["name":"fanbingbing","age":30]

       
//增加键值对
        dict["title"]
=
"女神"

       
//
根据key修改value
        dict["name"]
=
"linzhiling"

       
//删除
        dict.removeValueForKey("age")

       
print(dict)

       
// swift字典的遍历,跟for后面(
)中的变量名无关;

//        for (key,value) in dict{
       

for (a,b)

in dict{

           
print("key =
\(a)")

           
print("value =
\(b)")

        }

    }

   
/*

   
打印结果:

    ["title":
女神, "name": linzhiling]

    key = title

    value =
女神

    key = name

    value = linzhiling

    */

14.函数

   

/*

   
函数的基本格式

    func
函数名(参数名:参数类型)
->返回值类型

    */

   
func sum(a:Int,
b:Int) ->Int{

       
return
a+b

    }

   

/*

   
引入函数的外部参数

   
能够让外界调用,对函数的语义更加清晰,在函数内部使用更加简洁

    */

   
func area(height a:Int,
width b:Int) ->Int{

       
return
a*b

    }

   

   
//函数没有返回值的三种写法
   

func demo1(str:

String) ->Void{

       
print(str)

    }

   
func demo2(str:

String) ->(){

       
print(str)

    }

   
func demo3(str:

String) {

       
print(str)

    }

15.

oc中的block什么情况下会造成循环引用,闭包,怎么解决的?

__unsafe的风险。

16.

block是提前准备好

__weak一般在调用层进行添加,不在工具类Tool类添加。

17.按ESC可以补全没写全的方法

18.闭包的特点:

19.

/*

block(闭包)的特点:

1.提前准备好的一段可以执行的代码

2.block可以当做参数传递

3.在需要的时候执行block

4.在block中使用
self
有可能产生循环引用

20.block理解

a. 闭包和block都是作回调用的。

b. block、闭包回调是通过参数来传值。

c. 闭包中访问自己的方法,必须要加self。

d.

在block中访问self,会对外部变量做copy。

e. __weak weak 修饰的对象当被系统回收的时候,对象的地址会自动指向nil,给nil发送消息,在OC中是可以的,不会造成野指针访问,iOS5.0推出。

f. __unsafe_unretained

相当于assgin关键字,修饰的对象当被回收时,对象地址不会指向nil,iOS
4.0推出。

g. MRC

开发下最常见的错误之一:坏内存地址访问,俗称野指针访问。

h.

在异步方法中如果能直接执行block就直接执行,如果不需要立即执行;就需要用一个属性来记录block,在需要的时候执行。

i.
解决循环引用最终的一点:就是打破强引用循环。

j.

注意
:
循环引用,并没有那么容易出现。

k.

只有在有【成员变量】或者【属性】对外部的block

进行了记录,这时就需要考虑循环引用。

*/

21.

析构函数与 OC 的dealloc方法的作用是一致的。

22.

swift中的当发现一个对象为nil,不会给它发送任何消息;

而OC中会发送消息,但没有任何作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息