zoukankan      html  css  js  c++  java
  • 类型转换,接口和扩展

    1.没有任何关系两个类型之间的转换

    let i = 3
    let str = "(i)"    //插值法
    let str2 = String(i)  //强制转换

    2.继承链条里的向上与向下转型

    class Parent{
       var p = 1
    }
    
    class Child: Parent {
       var c = 2
    }
    
    let pins: Parent = Child()
      //这时要访问子类的c就要判断了
    let cins = pins as? Child //返回的是Optional
     cins?.c  //访问到了子类的c
    //optional 用 if 绑定
    if let cins2 = pins as? Child {
       cins2.c
    }
     cins!.c   //显示解封
    
    let cins3 = pins as! Child 
    cins3.c
    let result = pins is Child //判断是否是Child类型,返回true or false
    let result2 = pins is Parent

    AnyObject:表示任意类(class)的类型
    Any:任意类型,比如结构,枚举,类,函数等等

    class ForAny1 {
       var fa  = 2
    }
    class ForAny2 {
       var fa2 = 3
    }
    let data:[AnyObject] = [ForAny1(),ForAny2(),ForAny1(),ForAny1(),ForAny2()] //用data来存放不同的类
    
    var any1Count = 0
    var any2Count = 0
    for item in data {
       if item is ForAny2 {
           any2Count++
       }
       
       if let ins = item as? ForAny1 {
           ins.fa   //输出fa的值
       }
       
    }
    
    any2Count  //找出ForAny2()的个数 
    let dataA:[AnyObject]
    = [ForAny1(),ForAny1(),ForAny1()] //定义一个ForAny1()的数组类
    let data2
    = dataA as! [ForAny1] //把值赋给data2去接收
    data2[
    0].fa //取出fa的值

    扩展

    不能:
    1. 不能添加存储属性(应该是对 init 的影响)
    2. 不能给属性添加观察者
    3. 不能给类添加特定的初始化器
    4. 不能给类添加析构函数

     给int类型添加计算属性

    extension Int {
        var m: Int {
           return 1
        }
        var km: Int {
            return self * 1000
        }
    }
    
    let i = 20
    i.m
    i.km

    1. 可以用来扩展类,结构,枚举,协议等(即使这些你没有源代码

    ,系统的都可以)
    2. 可以增加但不能重写已存在的功能
    ------------------------
    1. 可以添加实例计算属性与静态计算属性(比如给double类型添加

    一些表示长度单位的计算属性)
    2.添加实例方法与类方法
    3.提供新的初始化方法。
        1.可以让别的类型作为新增init的参数
        2.或其它的init选项
    3.给值类型通过扩展添加init,也可以保留在原值类型中由编译器

    自动添加的各种init
    4.增加下标
    5.让已存在的类型实现一个协议

    协议

    协议:就是接口的含义

    添加属性时:
    1.只指定属性的名字与类型,不指定是否是存储与计算属性
    2.只能在协议中用static修饰静态属性。但在实现类型可以用class

    也可以用static
    3.只读属性 var a: Int {get}
    4.读写属性var b: Int {get set}
    5.协议中的属性总是用var声明的 ,但是在实现时可以实现为let

    添加方法时:
    1.不需要大括号
    2.支持可变长度参数
    3.默认值不能在协议中指明
    4.静态方法也用static修饰(在协议中)
    5.协议中得方法可以添加mutating,在类中得实现中,可以不需要

    mutating,在值类型
    中得实现中就必须加mutating

    //通过某个拓展类来实现某个协议
    
    protocol ExampleProtocol{
        var simpleDescription: String{get}
        mutating func adjust()
    
    
    }
    
    extension Int:ExampleProtocol{
        var simpleDescription: String
            {
        return "The number(self)"
        
        
        }
       mutating func adjust() {
            self+=42
        }
    
    
    
    
    }
    var jj:Int=20
    jj.adjust()
    jj.simpleDescription


















  • 相关阅读:
    linux find 命令用法
    在linux下使用libsvm
    利用merge sort寻找逆序对
    merge sort
    int与Integer的区别
    java 的回调函数
    weka的libsvm使用
    mysql 常用基准测试工具
    Drupal的taxonomy_manager模块合并分类的方法
    Sphinx数据源配置的一些注意点
  • 原文地址:https://www.cnblogs.com/kangniuniu/p/4957343.html
Copyright © 2011-2022 走看看