首页投稿(暂停使用,暂停投稿)小说里的故事,生活里的童话

【Swift3基础】基础语法

2017-04-25  本文已影响96人  亲爱的大倩倩
/*基本说明
 创建游乐场,可以立即看到效果
 
 创建对象:
 OC:alloc init
 Swift: XXX()
 
 调用方法
 OC: [UIColor redColor];
 Swift: UIColor.red
 
 枚举:
 OC: UIButtonTypeContactAdd
 Swift:UIButtonType.contactAdd 其中UIButtonType可以省略
 
 创建结构体
 OC: CGPointMake()
 Swift: CGPoint()
 */
let view = UIView(frame: CGRect(x:100 ,y:100 , width: 50, height:100))
view.backgroundColor = UIColor.red

let btn = UIButton(type: .contactAdd)
btn.center = CGPoint(x: 25, y: 50)
view.addSubview(btn)
/*常亮和变量
 let: 定义常量,不可修改
 var: 定义变量,可修改
 注意: swift中定义常量和变量不需要写数据类型,编译器会根据后面的真实类型自动推导,10是int型,10,1是double类型
      每行语句末尾可以不写分号结尾(写了也没关系),若不写会自动将换行作为语句结尾,如果一行有多条语句,那么每条语句结尾必须写上分号
 */
/*数据类型转换
 OC: 数据类型写在变量前面
 Swift: 数据类型写在变量后面,并且用冒号隔开
 强制转换: 数据类型()
 Swift中不存在隐式类型转换,所有类型转换都是显示的,如下面let sum = num1 + num2会报错,但OC会自动将num1变成10.0再相加
 */
/*
 分支_if
 Swift中if使用基本和OC一致
 1.Swift中if可以省略后面的()
 2.Swift中哪怕if后面只有一条语句,也不能省略{}
 3. 在C和OC中,if括号内非0即真
    在Swift中,if括号内只能放bool值,取值只有两个 true/false,若是if a 则错误
 
 分支_if else
 1.Swift中if else和OC一样使用
 2.但Swift中if else可以使用三目运算符简写
 
 分支_switch
 1.switch后面的()可以省略,case后面的break可以省略
 2.OC中如果没有break会穿透,但Swift不会穿透
 3.OC中如果要在case中定义变量要加{}作用域,Swift不用
 4.OC的default位置可以随便放,只要所有case都不满足就会执行default,但Swift中default只能放在最后
 5.OC中的default可以省略,但Swift中大部分不能省略
 
 分支_for循环
 以下...之间不可有空格
 0..<10 代表一个区间范围,含头不含尾,从0到9,按下面的例子,会将0-9之间的值,依次赋值给i,然后在执行循环中的打印语句,若不需要i,可以使用_
 _ 代表忽略,如果不关心某个参数,就可以使用_
 0...10 代表一个区间范围,含头含尾,从1-10
 
 分支_while循环
 Swift中while循环和OC中使用一样
 
 分支_do while循环
 do while没有do,因为do被用于捕获异常了
 */
/*可选类型:如下列,url创建的可能有值也可能是nil(url含中文),所以就返回可选类型
 Optional   代表可以有也可以没有
 convenience init?  若看到方法或数据类型后面有? 代表返回的是一个可选类型
 注意:    若打印可选类型,结果会被Optional包裹,如果不想被包裹,则需要加一个!
 !  代表告诉编译器,可选类型中一定有值,强制解析
    如果可选类型中没有值,而又强制解析,则会崩溃
 可选绑定,会将url中的值取出来赋值给urlFinal变量,如果值不为nil,才会进入{},按住Option看到urlFinal是不带?的,而上面的url是带?的
 */
/*字符串String是个结构体,而OC中是NSString是个对象,继承与NSObject
 定义:    OC用@"",Swift用""
 拼接:    直接+=
 格式化拼接: \()或者format,arguments,其中format,arguments需要将所有的值放入数组中
 和OC转化: : NSString或as NSString
   截取:    使用OC的字符串截取,先将Swift字符串转化成OC字符串再截取
 遍历:      for循环直接遍历
 */
/*备注
 
 SWift特点:
 快速,现代,安全,互动,明显优于OC
 可用框架Cocoa 和Cocoa Touch
 取消了OC的指针和其他不安全性的访问,OC是动态运行时,你写的即时不对,编译也不报错,但Swift会在编译的时候报错
 舍弃了OC的smalltalk语法,改为句点表达法
 提供了类似Java的名字空间,泛型,运算对象重载等高级语法
 Swift是没有C的OC
 
 
 
 开发技巧: 按住option,点num即可看到类型
 句末不用分号结尾,Swift会自动帮我们在句末添加分号,但如果一行有多句语句,要用分号隔开
 Swift是强语言,OC是弱语言,若是在OC中 int a = 10.1,OC会将a强制转化成10
 Swift中数据类型首字母大写
 没有C中的++和-- 变成了+=1
 OC是在运行时发现错误,?和!的使用,使得Swift是在编译过程中就发现大部分错误
 ? 可选类型,可以有值也可以没值
 ! 强制解析,之前要进行判断
 控制器中能不写self,就不写self,你写在哪个控制器内的view,就证明你调的是那里的view
 看见self证明你是在闭包中
 
 通过调用栈来分析调用步骤
 */

    
    /*
     OC的Block: 类似于匿名函数,用于保存一段代码,在需要的时候执行
     Swift的闭包:也是用来定义函数,也用于保存一段代码,在需要的时候执行
     作用:在耗时操作时使用
     定义: in用来去等形参返回值和执行代码
     {
        (形参列表) -> (返回值)
        in
        需要执行的代码
     }
     */
    func sum (number1:Int, number2:Int) -> Int
    {
        return number1 + number2;
    }
   
    func loadData(finished: ()->())
    {
        print("执行耗时操作")
        finished()
    }
//在viewDidLoad中调用
        let sumTwoNubmer = sum(number1:2, number2: 3)
        print(sumTwoNubmer)
        
        loadData(finished:
            {print("被回调了")
            view.backgroundColor = UIColor.red
            })
   
    //要求:定义一个方法来创建UIScrollView,并且UIScrollView上有多少个按钮必须通过闭包来告诉该方法
    func creatScrollView(btnCount: () -> Int) -> UIScrollView
    {
        //1.创建scrollView
        let sc = UIScrollView(frame: CGRect(x: 100, y: 100, width: 200, height: 50))
        sc.backgroundColor = UIColor.red
        //创建N多Button
        let count = btnCount()
        for i in 0..<count
        {
        let btn = UIButton(frame: CGRect(x: i*80, y: 0, width: 80, height: 30))
        btn.setTitle("标题\(i)", for: UIControlState.normal)
        btn.backgroundColor = UIColor.blue
        sc.addSubview(btn)
        }
        sc.contentSize = CGSize(width: count*80, height: 0)
        return sc
    }
//在viewDidLoad中调用
        //闭包创建button个数,当调用这个方法时候,调用下面的creatScrollView函数,当执行到let count = btnCount(),会返回来调用这个闭包,得到5,再将值赋值给count
        let sc = creatScrollView { () -> Int in
            return 5
        }
        view.addSubview(sc)
    //循环引用
    //定义属性保存block最容易出现循环引用,在闭包中使用了self就循环引用了
    //析构函数,相当于OC中的dealloc
    deinit
    {
        print("被销毁")
    }
    //懒加载:用到时再加载,节约性能,并且只加载一次
    //格式:定义变量时前面使用lazy来修饰变量,后面通过等号赋值一个闭包
    //注意1.必须用var修饰,注意2:闭包后面必须跟上()注意3:如果闭包是用于懒加载,那么in之前的代码都可以删除,包括in
    lazy var dataList: [String] =
    {
        () -> [String]
        in
        print("懒加载执行了")
        return["1","2","3"]
    }()
    
    lazy var dataList2: [String] =
    {
        print("哈哈哈哈哈哈")
        return["6","7","7"]
    }()
    
    
    //懒加载执行了这句话只会调用一次,但会按点击次数输出["1","2","3"]
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    {
        print(dataList)
        print(dataList)
        print(dataList)
        
        print(dataList2)
        print(dataList2)
        print(dataList2)
    }
上一篇下一篇

猜你喜欢

热点阅读