Swift中“static var”和“var”的主要区别是什么?有人可以用一个小例子来解释这个差异吗?
答案 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