gpt4 book ai didi

ios - 在 lowerCamelCase 中命名变量时的奇怪行为

转载 作者:搜寻专家 更新时间:2023-10-31 22:03:53 25 4
gpt4 key购买 nike

我在编写 Master-Detail 应用程序时遇到了 Swift 中的一个奇怪行为。

场景如下:
这是一个简单的任务管理器应用程序。我在 TaskDetailView 上有两个文本控件(TaskNameTaskDescription)和两个具有相同名称但采用 lowerCamelCase 的字符串变量(taskNametaskDescription) 在 TaskDetailViewController 中声明。

@IBOutlet var TaskName:UITextField!         //UpperCamelCase
@IBOutlet var TaskDescription:UITextView! //UpperCamelCase
var taskName:String? //lowerCamelCase
var taskDescription:String? //lowerCamelCase

我像往常一样在 ViewDidLoad() 上设置文本控件的值:

override func viewDidLoad() {
super.viewDidLoad()
TaskName.text = taskName
TaskDescription.text = taskDescription
}

我像往常一样在 prepareForSegue 中传递数据(来自 TaskListViewController):

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if(segue.identifier == "TaskListSegue"){
let detailViewController = segue.destinationViewController as ToDoTaskViewController
let (task, desc) = m_ToDoListManager.GetTask(TaskListView.indexPathForSelectedRow().row)
println("selected \(task) \(desc)")
detailViewController.taskName = task
detailViewController.taskDescription = desc
}
}

一切的实现方式都是正确的。但是现在当您运行该应用程序时,文本控件的值并未设置。事实上,变量的值也没有设置。

这里一定发生了什么?
我已经调查过这个问题并提出了解决方案(请参阅下面的回答)。另请参阅下面 Martin R 的回答以获取详细说明。我只是想和大家分享这个。我不确定是否有人遇到过这个问题。

更新:
这是实际代码:https://github.com/Abbyjeet/Swift-ToDoList

最佳答案

解释如下:

  • 您的 Swift 类(最终)是 NSObject 的子类。
  • 因此这些属性是具有 getter 和 setter 方法的 Objective-C 属性。
  • 属性的 setter 方法的名称由第一个大写构成属性名称的字母,例如属性“foo”具有 setter 方法 setFoo:

因此,两个 属性 TaskNametaskName 的 setter 方法称为 setTaskName:

在 Objective-C 文件中,您会遇到编译错误

synthesized properties 'taskName' and 'TaskName' both claim setter 'setTaskName:' - use of this setter will cause unexpected behavior

但是 Swift 编译器并没有注意到这个冲突。

问题的一个小演示:

class MyClass : NSObject {
var prop : String?
var Prop : String?
}

let mc = MyClass()
mc.prop = "foo"
mc.Prop = "bar"
println(mc.prop) // bar
println(mc.Prop) // nil

在你的情况下

TaskName.text = ...

设置“taskName”属性,而不是“TaskName”。属性有不同的类型,因此行为是未定义的。

请注意,问题发生在“Objective-C 兼容”属性中。如果你删除上例中的 NSObject 父类(super class),输出符合预期。

结论:您不能拥有两个仅在第一个字母的情况。 Swift 编译器应该在这里失败并报错(因为Objective-C 编译器可以)。

关于ios - 在 lowerCamelCase 中命名变量时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24803484/

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