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

static关键字

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

struct Point {let x: Doublelet 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:Stringstatic 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"}
}

转载于:https://www.cnblogs.com/junhuawang/p/6247991.html

Swift - static和class的使用相关推荐

  1. Swift类与OC类方法相互调用的

    2019独角兽企业重金招聘Python工程师标准>>> 收集整理,希望对大家有帮助 1.OC调用Swift实例方法 例如在ViewController.m类里调用Swift的logM ...

  2. 从Java/Android到Swift iOS开发:语言与框架对比

    今天分享的主题是Java/Android开发人员如何快速上手Swift iOS开发.主要内容如下: WhyFrom Java/Android to Swift Swift语言为什么值得学习? Java ...

  3. Cocoapods:podspec与使用过程中遇到的问题

    Cocoapods:podspec与问题 在实际使用中,遇到一些疑问,记录下来 use_frameworks! 为啥要在CocoaPods中使用 use_frameworks!,参考: Why do ...

  4. iOS开发中自带的图标库

    iOS 开发中苹果自带的图标库,uiimage可直接调用 @available(iOS 13.0, *) @objc public extension UIImage{ /// square.and. ...

  5. Swift类属性 static

    2019独角兽企业重金招聘Python工程师标准>>> 使用 static 关键字进行属性的定义 调用时直接用 类名进行调用 class ClassRoom{ static var ...

  6. swift文件服务器,Swift3一行代码将各种类型文件上传到服务器

    由于之前一直在忙项目,很久没有写过一篇像样的文章了,现在手上的项目基本是完成了,正好工作时间偷个懒写两篇文章. 将相机或相册图片上传到服务器 先看看最常见的图片上传,也可以选择跳过,后面有直接的封装方 ...

  7. swift中单例的创建及销毁

    最近项目重构时使用了oc和swift的混编,遇到了关于单例的创建及销毁,这里记录一下 //创建单例private static var _sharedInstance: ViewController? ...

  8. SQLite.swift的简单使用

    使用cocoapod 来进行引入 pod 'SQLite.swift' // // SQLiteTool.swift // CreateLectureForSwift // // Created by ...

  9. Swift学习总结【持续更新】

    1. try.try?.try!的区别: try:需要用catch捕捉异常,如: do {let data = try encoder.encode(item) try data.write(to: ...

最新文章

  1. ajax异步传输数据时return返回总是undefined(转载)
  2. python反转链表和成对反转
  3. Spring-AOP概述
  4. RHEL 6.0安装Qt
  5. 引入struts html标签,【学习】Struts标签之html标签
  6. linux java weblogic,Linux java 安装问题
  7. 泰坦尼克号python数据分析统计服_Titanic数据分析报告(Python)
  8. power bi 创建空表_如何使用R在Power BI中创建地理地图
  9. 大数据技术在应急事件处理中的启示
  10. python找不到csv文件路径_无法识别csv的构造文件路径。但文件是
  11. 西游记中荆棘岭五个树精
  12. Windows 系统维护
  13. 数据库:数据查询(指定的列、全部列、经过计算的值、消除重复的行、查询满足条件的元组、比较查询、范围查询、集合查询、字符匹配查询)
  14. 把linux当无线路由器用,基于树莓派的无线路由器改造
  15. 基于OpenAI的Chatbot开发记录
  16. 运用KDJ交叉形态把握短期买卖点
  17. ubuntu kylin17 安装字体教程
  18. 狂神redis笔记_狂神说redis笔记(三)
  19. 在早教阶段幼儿应不应该使用计算机,计算机与幼儿教育
  20. Qt Qwdget 汽车仪表知识点拆解6 自定义控件

热门文章

  1. 微软网站下载XPerf没有成功
  2. Win32 GetWindowLong函数实例Demo
  3. .net加密解密学习总结
  4. 配置JDK时发生'javac'不是内部或外部命令的现象与解决过程
  5. 文本和代码文件助手软件
  6. MB_SELECT_GR_BLOCKED_STOCK 读取物料收货冻结库存
  7. vue源码解析之选项合并(二)
  8. 印钞机 V1.0(量化选基总结)
  9. 扩展gcd codevs 1200 同余方程
  10. ubuntu下搭建eclipse+tomcat的web开发环境