"静态var"之间的差异和" var"在斯威夫特

时间:2014-12-01 09:06:01

标签: swift static var

Swift中“static var”和“var”的主要区别是什么?有人可以用一个小例子来解释这个差异吗?

3 个答案:

答案 0 :(得分:11)

static var属于类型本身,而var属于类型的实例(特定类型的特定值)。例如:

struct Car {
    static var numberOfWheels = 4
    var plateNumber: String
}

Car.numberOfWheels = 3
let myCar = Car(plateNumber: "123456")

所有车辆都有相同数量的车轮。您可以在类型Car本身上更改它。

要更改印版号,您需要拥有Car的实例。例如,myCar

答案 1 :(得分:1)

静态var是结构上的属性变量,而不是结构的实例。请注意,枚举也可以存在静态变量。

示例:

struct MyStruct {
    static var foo:Int = 0
    var bar:Int
}

println("MyStruct.foo = \(MyStruct.foo)") // Prints out 0

MyStruct.foo = 10

println("MyStruct.foo = \(MyStruct.foo)") // Prints out 10

var myStructInstance = MyStruct(bar:12)

// bar is not 
// println("MyStruct.bar = \(MyStruct.bar)")

println("myStructInstance = \(myStructInstance.bar)") // Prints out 12

注意区别? bar是在struct的实例上定义的。而foo是在结构本身上定义的。

答案 2 :(得分:1)

我会给你一个基于this post的非常好的Swifty示例。虽然这有点复杂。

想象一下,你有一个项目,你的应用程序中有15个collectionViews。对于每个你必须设置cellIdentifier& nibName。你真的想为你重写15次代码吗?

您的问题有一个非常POP解决方案:

让我们通过编写一个返回ClassName

的字符串版本的协议来帮助自己
protocol ReusableView: class {
    static var defaultReuseIdentifier: String { get }
}

extension ReusableView where Self: UIView {
    static var defaultReuseIdentifier: String {
        return String(Self)
    }
}
extension BookCell : ReusableView{
}

您创建的每个自定义单元格的nibName都相同:

protocol NibLoadableView: class {
    static var nibName: String { get }
}

extension NibLoadableView where Self: UIView {
    static var nibName: String {
        return String(Self)
    }
}

extension BookCell: NibLoadableView {
}

所以现在我需要nibName我只会做

BookCell.nibName

我需要cellIdentifier我需要做的事情:

BookCell.defaultReuseIdentifier

现在专门针对您的问题。您是否认为我们需要为每个新的BookCell实例更改cellIdentifier?!没有! BookCell的所有单元格都具有相同的标识符。这不会改变每个实例。结果就是static

虽然我确实回答了你的问题,但是减少15个collectionViews的行数的解决方案仍然可以得到显着改善,所以看到链接的博客帖子。

该博客文章实际上已由NatashaTheRobot

转变为video