微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift开发必备技巧:static和class的使用

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

在非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,Point(x: 1,y: -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 MyClass { 
    class var bar: Bar? 
}

编译时会得到一个错误

class variables not yet supported

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

一个比较特殊的是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"  
    }  
}

载自:Swifter

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐