gpt4 book ai didi

swift - 奇怪的类函数属性——有人能解释一下这段 Swift 代码吗?

转载 作者:搜寻专家 更新时间:2023-11-01 06:23:39 24 4
gpt4 key购买 nike

为了在 TableView 中创建索引,我找到了一段关于 TableView 中的部分的代码:

class User: NSObject {
let namex: String
var section: Int?

init(name: String) {
self.namex = name
}
}

// custom type to represent table sections
class Section {
var users: [User] = []

func addUser(user: User) {
self.users.append(user)
}
}

// raw user data
let names = [
"Clementine",
"Bessie",
"Annis",
"Charlena"
]

// `UIKit` convenience class for sectioning a table
let collation = UILocalizedIndexedCollation.currentCollation() as UILocalizedIndexedCollation

// table sections
var sections: [Section] {
// return if already initialized
if self._sections != nil {
return self._sections!
}

// create users from the name list
var users: [User] = names.map { namess in
var user = User(name: namess)
user.section = self.collation.sectionForObject(user, collationStringSelector: "namex")
return user
}

// create empty sections
var sections = [Section]()
for i in 0..<self.collation.sectionIndexTitles.count {
sections.append(Section())
}

// put each user in a section
for user in users {
sections[user.section!].addUser(user)
}

// sort each section
for section in sections {
section.users = self.collation.sortedArrayFromArray(section.users, collationStringSelector: "namex") as [User]
}

self._sections = sections

return self._sections!

}
var _sections: [Section]?

我不明白的部分是:

// table sections
var sections: [Section] {
// return if already initialized
if self._sections != nil {
return self._sections!
}

// etc...

return self._sections!

}
var _sections: [Section]?

我的问题是:

var sections: [Section] { } 是什么意思?我猜它不是函数,因为前面没有 func 关键字。

这是什么 var _sections: [Section]?为什么要在前面放一个_

最佳答案

尽管没有关键字,但它与函数非常相似——它是一个 computed property .

这些看起来像变量,但作用像函数。它们可以是只读的(get 但不是 set),或者可以同时具有 getset版本。这是一个更简单的示例:

var y = 3

var x: Int {
get { return 2*y }
}

println(x) // prints 6
y += 1
println(x) // prints 8

var z: Int {
get { return y }
set(newVal) { y = newVal }
}

println(z) // prints 4
z = 10 // sets y to 10
println(x) // prints 20 (2*10)

当它只是一个get时,你可以省略关键字,这就是它在你问题中的版本中完成的方式。上面的 x 声明可以没有它来编写:

var x: Int {
return 2*y
}

示例中的 var _sections 与上述代码中的 y 变量起着类似的作用——它是计算属性结果的基础数据。 _ 的原因只是为了表明它是一个内部实现细节。下划线对 Swift 本身没有意义,那只是人们使用的命名约定。

关于swift - 奇怪的类函数属性——有人能解释一下这段 Swift 代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com