zoukankan      html  css  js  c++  java
  • Swift

    Swift中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是static和class。这两个关键字确实都表达了这个意思,但是在其他一些语言,包括Objective-C中,我们并不会特别地区分类变量/类方法和静态变量/静态函数。但是在Swift中,这两个关键字却是不能用混的。

    static关键字

    在非class的类型上下文中,我们统一使用static来描述类型作用域。这包括在enum和struct中表述类型方法和类型属性时。在这两个值类型中,我们可以在类型范围内声明并使用存储属性,计算属性和方法。static适用的场景有这些

    struct Point {
        let x: Double
        let y: Double
        // 存储属性
        static let zero = Point(x: 0, y: 0)
        // 计算属性
        static var ones: [Point] {
            return [Point(x: 1, y: 1),
                    Point(x: -1, y: 1),
                    Point(x: 1, y: -1),
                    Point(x: -1, y: -1)]
        }
        // 类型方法
        static func add(p1: Point, p2: Point) -> Point {
            return Point(x: p1.x + p2.x, y: p1.y + p2.y)
        }
    }

    enum的情况与这个十分类似,就不再列举了

    class关键字

    class关键字相比起来就明白许多,是专门用在class类型的上下文中的,可以用来修饰类方法以及类的计算属性。要特别注意class中现在是不能出现存储类属性的,我们如果写类似这样的代码的话:

    class MyClass {
        class var bar: Bar?
    }

    编译时会得到一个错误:

    class variables not yet supported

    这主要是因为在Objective-C中就没有类变量这个概念,为了运行时的统一和兼容,暂时不太方便添加这个特性。Apple表示今后将会考虑在某个升级版本中实装class类型的类存储变量,现在的话,我们只能在class中用class关键字声明方法和计算属性。

    static和class总结

    类可以使用关键字static class 修饰方法,但是结构体、枚举只能使用关键字static修饰
      // 定义类   
     class StudentC{
        static var des:String = "学生的类"
       var name:String!
        func getName()->String{
            return name
        }
    
        class func describe()->String{
            return des
        }
    
        static func getClassDescribe()->String{
            return des
        }
    }
    
    // 定义结构体
    struct StudentS{
        static var des:String = "学生的结构体"
        var name:String
        static func describe()->String{
            return "这是一个定义学生的类"
        }
    }
    

    有一个比较特殊的是protocol。在Swift中class、struct和enum都是可以实现protocol的。那么如果我们想在protocol里定义一个类型域上的方法或者计算属性的话,应该用哪个关键字呢?答案是使用class进行定义,但是在实现时还是按照上面的规则:在class里使用class关键字,而在struct或enum中仍然使用static——虽然在protocol中定义时使用的是class:

    protocol MyProtocol {
        class func foo() -> String
    }
    struct MyStruct: MyProtocol {
        static func foo() -> String {
            return "MyStruct"
        }
    }
    enum MyEnum: MyProtocol {
        static func foo() -> String {
            return "MyEnum"
        }
    }
    class MyClass: MyProtocol {
        class func foo() -> String {
            return "MyClass"
        }
    }
  • 相关阅读:
    使用Maven快速创建一个SpringMVC工程步骤
    签到
    yaml简介
    APP定位元素之UiSelector
    js中var、let、const区别
    用Jquery去写树结构
    正则相关的知识分享
    python常见问题
    Vue.js 的一些小技巧
    关于jsp删除成功,添加成功等之后 页面自动跳转的js写法
  • 原文地址:https://www.cnblogs.com/junhuawang/p/6247991.html
Copyright © 2011-2022 走看看