Swift中的类型属性(静态变量)

http://blog.haohtml.com/archives/15098

Swift中的类型属性(静态变量)

Posted on 2014/06/13

类型属性语法

在 C 或 Objective-C 中,静态常量和静态变量的定义是通过特定类型加上global关键字。在 Swift 编程语言中,类型属性是作为类型定义的一部分写在类型最外层的花括号内,因此它的作用范围也就在类型支持的范围内。

使用关键字static来定义值类型的类型属性,关键字class来为类(class)定义类型属性。下面的例子演示了存储型和计算型类型属性的语法:

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
    // 这里返回一个 Int 值
    }
}
enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
    // 这里返回一个 Int 值
    }
}
class SomeClass {
    class var computedTypeProperty: Int {
    // 这里返回一个 Int 值
    }
}

注意:

例子中的计算型类型属性是只读的,但也可以定义可读可写的计算型类型属性,跟实例计算属性的语法类似。

获取和设置类型属性的值

跟实例的属性一样,类型属性的访问也是通过点运算符来进行,但是,类型属性是通过类型本身来获取和设置,而不是通过实例。比如:

println(SomeClass.computedTypeProperty)
// 输出 "42"

println(SomeStructure.storedTypeProperty)
// 输出 "Some value."
SomeStructure.storedTypeProperty = "Another value."
println(SomeStructure.storedTypeProperty)
// 输出 "Another value.”

下面的例子定义了一个结构体,使用两个存储型类型属性来表示多个声道的声音电平值,每个声道有一个 0 到 10 之间的整数表示声音电平值。

后面的图表展示了如何联合使用两个声道来表示一个立体声的声音电平值。当声道的电平值是 0,没有一个灯会亮;当声道的电平值是 10,所有灯点亮。本图中,左声道的电平是 9,右声道的电平是 7。

上面所描述的声道模型使用AudioChannel结构体来表示:

struct AudioChannel {
    static let thresholdLevel = 10
    static var maxInputLevelForAllChannels = 0
    var currentLevel: Int = 0 {
    didSet {
        if currentLevel > AudioChannel.thresholdLevel {
            // 将新电平值设置为阀值
            currentLevel = AudioChannel.thresholdLevel
        }
        if currentLevel > AudioChannel.maxInputLevelForAllChannels {
            // 存储当前电平值作为新的最大输入电平
            AudioChannel.maxInputLevelForAllChannels = currentLevel
        }
    }
    }
}

结构AudioChannel定义了 2 个存储型类型属性来实现上述功能。第一个是thresholdLevel,表示声音电平的最大上限阈值,它是一个取值为 10 的常量,对所有实例都可见,如果声音电平高于 10,则取最大上限值 10(见后面描述)。

第二个类型属性是变量存储型属性maxInputLevelForAllChannels,它用来表示所有AudioChannel实例的电平值的最大值,初始值是 0。

AudioChannel也定义了一个名为currentLevel的实例存储属性,表示当前声道现在的电平值,取值为 0 到 10。

属性currentLevel包含didSet属性监视器来检查每次新设置后的属性值,有如下两个检查:

  • 如果currentLevel的新值大于允许的阈值thresholdLevel,属性监视器将currentLevel的值限定为阈值thresholdLevel
  • 如果修正后的currentLevel值大于任何之前任意AudioChannel实例中的值,属性监视器将新值保存在静态属性maxInputLevelForAllChannels中。

注意:

在第一个检查过程中,didSet属性监视器将currentLevel设置成了不同的值,但这时不会再次调用属性监视器。

可以使用结构体AudioChannel来创建表示立体声系统的两个声道leftChannelrightChannel

var leftChannel = AudioChannel()
var rightChannel = AudioChannel()

如果将左声道的电平设置成 7,类型属性maxInputLevelForAllChannels也会更新成 7:

leftChannel.currentLevel = 7
println(leftChannel.currentLevel)
// 输出 "7"
println(AudioChannel.maxInputLevelForAllChannels)
// 输出 "7"

如果试图将右声道的电平设置成 11,则会将右声道的currentLevel修正到最大值 10,同时maxInputLevelForAllChannels的值也会更新到 10:

rightChannel.currentLevel = 11
println(rightChannel.currentLevel)
// 输出 "10"
println(AudioChannel.maxInputLevelForAllChannels)
// 输出 "10"

转自:http://numbbbbb.github.io/the-swift-programming-language-in-chinese/chapter2/10_Properties.html

This entry was posted in 程序开发 and tagged swift by admin. Bookmark the permalink.

时间: 2024-10-22 10:59:28

Swift中的类型属性(静态变量)的相关文章

内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

内部类访问外部类的变量必须是final吗? 如下:class A{int i = 3;public void shout(){ class B{public void shout1(){System.out.println(i);} }B b=new B();b.shout1();} public static void main(String [] args){A a=new A();a.shout();} }可正常输出3,证明可以访问类的变量i,但改为下面的方式:class A{public

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

Swift中基本类型的转换

最近上手学习了Swift的语言,谙习JS的我感觉非常顺眼,在此记录下我的学习过程吧. 因为我对Objective-c接触的不多,所以在oc里头使用的东西目前我可能还有很多不知道他的存在. 最近在用swift写了一些小示例app,很多地方都用到了基本类型的转换,但是我发现他居然没有Integer.parse()这样的东西,所以还是摸索了一番. ps: 我使用的版本是xCode6 bate4(其他版本可能实现又差别) OK,talk is chaep, show you the code! 扩展Do

Swift中可选类型(Optional)的用法 以及? 和 ! 的区别 (转载博客,知识分享)

本文转载自:代码手工艺人的博客,原文名称:Swift之 ? 和 ! Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使用变量之前不进行初始化就会报错: C代码   var stringValue : String //error: variable 'stringValue' used before being initialized //let hashValue = stringVa

【iOS】Swift中Playground,常量、变量、字符串等小结

一.代码及书写的几点变化(相比于OC) 1. 更像Java,Javascript或Python的格式了 2. 结尾的分号可写可不写了(同一行的多条语句中间必须加分号) 3. 不需要写main函数了,直接是从上往下执行 4. 文件后缀变.swift了,不再是.h与.m两个文件了 ...... 二.Playground Playground顾名思义,Play是玩的意思,ground是地方的意思.拿来玩.写demo或者测试很nice.在WWDC上演示了Playground实时显示,并演示了一个简单的小

Java非静态内部类中为什么不能有静态变量却可以有常量?

如:public class InnerClassDemo{ int x; class A{ static int a = 0;//这样写是不合法的. static final int b=0;//这样写是合法的    }}解答:简单说,定义一个静态的域或者方法,要求在静态环境或者顶层环境,这里静态环境具体说,你的例子里如果加上 static class A就ok.非静态内部类 依赖于一个外部类对象,而静态域/方法是不依赖与对象——仅与类相关,因此,非静态内部类中不能定义静态域/方法,编译过不了

PHP的类中的常量,静态变量的问题。

自己在写一个小型的 angularJS 库的时候,觉得 javascript 中的很多概念有点像是PHP中的概念. 像类常量, 类中的静态变量(类的静态变量是类的所有实例都共享的),这些概念虽然在 javascript 中没有明确提出来,但是其实都是可以通过 javascript 本身的语法特性来实现的. 下面是PHP类中类常量,类的静态变量的简单用法,看代码: <?php class A{ const NUMBER=12; public static $age = 12; public $na

JavaSE7基础 类中 静态方法只能访问静态变量

版本参数:jdk-7u72-windows-i586注意事项:博文内容仅供参考,不可用于其他用途. 代码 class Test{ public static int num1 = 1; private static int num2 = 2; //静态方法只能访问静态变量 public static void sayHello(){ System.out.println(num1); System.out.println(num2); } } class Demo{ public static

线程中锁方法和静态变量的锁

1-----锁方法的使用: final ServletContext ctx = request.getServletContext();这个地方变量要定义成常量: new Thread(){//写成了内部类 public void run() { AddCount.add(ctx); }; }.start(); class AddCount{ //用类模板当锁 public synchronized static void add(ServletContext ctx){------- syn