在LowerCamelCase中命名变量时的奇怪行为

阿比耶

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

这是场景
这是一个简单的Task Manager应用程序。我有两个文本控件(TASKNAMETaskDescription在TaskDetailView),并具有相同的名称,但在lowerCamelCase(两个字符串变量TASKNAMEtaskDescription)在TaskDetailViewController声明。

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

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

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

马丁·R

这里是一个解释:

  • 您的Swift类(最终)是的子类NSObject
  • 因此,这些属性是使用getter和setter方法的Objective-C属性。
  • 通过使用属性名称的首字母大写来构建属性的setter方法的名称,例如,属性“ foo”具有setter方法setFoo:

因此,对于setter方法性质TaskNametaskName被调用setTaskName:

在一个Objective-C文件中,您将得到一个编译器错误

综合属性'taskName'和'TaskName'都声明了setter'setTaskName:'-使用此setter将导致意外行为

但是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在上面的示例中删除了超类,则输出是预期的。

结论:您不能有两个仅在首字母不同的情况下具有两个Objective-C属性。Swift编译器在此应失败并显示错误(就像Objective-C编译器一样)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

.UI中的.sheet在传递变量时的奇怪行为

来自分类Dev

在C中定义long long变量时的奇怪行为

来自分类Dev

Ruby中奇怪的局部变量行为

来自分类Dev

JavaScript中名为“状态”的变量的奇怪行为

来自分类Dev

JavaScript中名为“状态”的变量的奇怪行为

来自分类Dev

Ruby 在一行中单独分配变量时的奇怪行为

来自分类Dev

从python中的列表继承时的奇怪行为

来自分类Dev

返回选项时mapValues中的奇怪行为

来自分类Dev

检查Alloy中的断言时的奇怪行为

来自分类Dev

从R中的stdin读取时的奇怪行为

来自分类Dev

在viewDidLoad中调用addSubView时的奇怪行为

来自分类Dev

在 Pendrive 中传输文件时的奇怪行为

来自分类Dev

xpanes-tmux Windows标题命名中的奇怪行为

来自分类Dev

奇怪的行为java变量

来自分类Dev

涉及变量的奇怪行为

来自分类Dev

Makefile 奇怪的变量行为

来自分类Dev

-ErrorAction从COM对象设置变量时的奇怪行为

来自分类Dev

将全局变量添加到另一个文件中时的奇怪行为

来自分类Dev

Bash变量赋值奇怪的行为

来自分类Dev

数组的奇怪JavaScript变量行为

来自分类Dev

嵌套变量的奇怪bash行为

来自分类Dev

静态变量的奇怪行为

来自分类Dev

嵌套变量的奇怪bash行为

来自分类Dev

GHCi中的奇怪行为

来自分类Dev

PHP中的奇怪行为

来自分类Dev

NSViewController中的奇怪行为

来自分类Dev

PHP中的奇怪行为

来自分类Dev

$ scope中的奇怪行为。

来自分类Dev

Laravel 中的奇怪行为