willSet- didSet和get- 之间的区别是什么set?
从我的角度来看,他们都可以为一个属性设置一个值.何时以及为什么我应该使用willSet- didSet,何时get- set?
我知道,对于willSet和didSet,结构看起来像这样:
var variable1 : Int = 0 {
didSet {
println (variable1)
}
willSet(newValue) {
..
}
}
var variable2: Int {
get {
return variable2
}
set (newValue){
}
}
Run Code Online (Sandbox Code Playgroud) 我喜欢这个Swift语法; 它对很多东西很有帮助:
var foo: Bar = Bar() {
willSet {
baz.prepareToDoTheThing()
}
didSet {
baz.doTheThing()
}
}
Run Code Online (Sandbox Code Playgroud)
我很乐意在Kotlin这样做.但是,我找不到合适的语法!
Kotlin有什么相似的东西吗?
var foo: Bar = Bar()
willSet() {
baz.prepareToDoTheThing()
}
didSet() {
baz.doTheThing()
}
Run Code Online (Sandbox Code Playgroud) 我下面有一个简单的课程
import Foundation
public class UsefulClass: NSObject{
var test:NSNumber{
get{return self.test}
set{
println(newValue)
self.test = newValue
}
}
override init() {
super.init()
self.test = 5;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里初始化它
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var testClass = UsefulClass()
}
}
Run Code Online (Sandbox Code Playgroud)
但是由于EXC_BAD_ACCESS代码= 2,它会导致xcode打印出200 5s然后崩溃.为什么会发生这种情况?
两者不会几乎同时发生吗?时间流逝会如此微小,以至于我将代码放入哪个并不重要吗?
编辑:我的问题与那个链接不同,因为我在谈论 set 和 willSet 的功能,而链接则在谈论 willSet 和 didSet 的功能。因此,正在讨论两个不同的关键字。我知道 willSet 和 didSet 之间的区别,并且想了解更多关于 set 和 willSet 的信息。
我目前正在使用 swift 学习 ios 开发,我只是想知道 xcode 是否有办法
1) 只要变量的值发生变化,就在变量上设置断点
或者
2)以某种方式跟踪变量值随时间的变化
假设我有一个类,当我设置它的属性时,我希望它附加一个文件类型的属性.fileType:
class File {
var fileName: String {
get {
return self.fileName
}
set {
self.fileName = fileName + ".fileType"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用这样的:
let newFile = File()
newFile.fileName = "My File"
Run Code Online (Sandbox Code Playgroud)
不幸的是,变量从未设置:

我有两种可能的解决方法.
class File {
var fileName: String = "" {
didSet {
self.fileName += ".fileType"
}
}
}
let file = File()
file.fileName = "SomeName" // SomeName.fileType
Run Code Online (Sandbox Code Playgroud)
但是有了这个,我必须等到这个值已经设置好才能修改它.对于这个特殊的例子,它并没有太大的区别; 但是,我希望能够避免这种情况.
此解决方案基于此处的示例. 搜索'speedLimitedCar'
class File {
var fileName = ""
}
class …Run Code Online (Sandbox Code Playgroud) 我在编程方面非常陌生,并且很难理解这两个属性观察者。
我目前正在构建一个带有表格视图的应用程序,其中日期选择器包含在它的行中。在本例中,我有两个日期选择器。众所周知,日期选择器在单元格中占据很大的高度,因此您需要隐藏它们。下面的代码可以处理它:
var isCheckInDatePickerShown: Bool = false {
didSet{
checkInDatePicker.isHidden = !isCheckInDatePickerShown
}
}
var isCheckOutDatePickerShown: Bool = false {
didSet{
checkOutDatePicker.isHidden = !isCheckOutDatePickerShown
}
}
Run Code Online (Sandbox Code Playgroud)
我有非常基本的编程知识,所以我对didSet. a 会发生什么willSet?
我从Alamofire获取数据viewDidLoad,然后将其放入answerArray.然而,Alamofire连接之前,将numberOfRowsInSection被调用和返回0.我怎样才能通过Alamofire获取数据,然后再拿到eventArray.count的numberOfRowsInSection?
var answerArray = NSMutableArray()
override func viewDidLoad() {
let parameters = [
"id":questionNum
]
Alamofire.request(.POST, "http://localhost:3000/api/v1/questions/question_detail",parameters: parameters, encoding: .JSON)
.responseJSON { (request, response, JSON, error) in
println(JSON!)
// Make models from JSON data
self.answerArray = (JSON!["answers"] as? NSMutableArray)!
}
self.tableView.reloadData()
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return answerArray.count
}
Run Code Online (Sandbox Code Playgroud) 我花了很多时间..但我不知道为什么它不起作用..调用索引路径的单元格并正确设置值但单元格类我发现值为零..如果您需要任何信息,请告诉我。
在我的 collectionview 索引路径中
在 collectionview 单元格中
这是我的代码:
对于集合视图:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: menuBarItemDetailId, for: indexPath) as! MenuBarItemDetail
cell.shopCategory = "600"
print(cell.shopCategory)
return cell
}
Run Code Online (Sandbox Code Playgroud)
对于细胞:
class MenuBarItemDetail: UICollectionViewCell , UITableViewDataSource , UITableViewDelegate {
var shopCategory : String?
override init(frame: CGRect) {
super.init(frame: frame)
print("shopCategory :-> ...i am calling from cell :\(shopCategory)")
}
Run Code Online (Sandbox Code Playgroud) 我有理解之间的差别难度willSet和didSet.有人可以对他们的使用有所了解吗?
我看了一下,但找不到合适的答案。我有一个用药物名称填充的表格视图。药品已输入,因为它们是从文本输入Xcode的,如下所示。
class MasterViewController: UITableViewController {
// MARK: - Properties
var detailViewController: DetailViewController? = nil
var drugs = [Drug]()
var filtereddrugs = [Drug]()
let searchController = UISearchController(searchResultsController: nil)
// MARK: - View Setup
override func viewDidLoad() {
super.viewDidLoad()
// Setup the Search Controller
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
definesPresentationContext = true
searchController.dimsBackgroundDuringPresentation = false
// Setup the Scope Bar
searchController.searchBar.scopeButtonTitles = ["All", "Green", "Blue", "Amber", "Red", "Black"]
tableView.tableHeaderView = searchController.searchBar
drugs = [
Drug(category:"Green", name:"Magnesium Trisilicate"),
Drug(category:"Green", name:"Co-magaldrox (Mucogel)"),
Drug(category:"Green", …Run Code Online (Sandbox Code Playgroud)