当前位置 : 主页 > 手机开发 > ios >

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

来源:互联网 收集:自由互联 发布时间:2021-06-11
在编写Master-Detail应用程序时,我在 Swift中遇到了一个奇怪的行为. 这是场景: 这是一个简单的任务管理器应用程序.我在TaskDetailView上有两个文本控件(TaskName,TaskDescription)和两个字符串变量
在编写Master-Detail应用程序时,我在 Swift中遇到了一个奇怪的行为.

这是场景:
这是一个简单的任务管理器应用程序.我在TaskDetailView上有两个文本控件(TaskName,TaskDescription)和两个字符串变量,它们具有相同的名称,但在TaskDetailViewController中声明的lowerCamelCase(taskName,taskDescription)中.

@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

这是一个解释:

>你的Swift类(最终)是NSObject的子类.
>因此,属性是具有getter和setter方法的Objective-C属性.
>属性的setter方法的名称是通过大写第一个来构建的
财产名称的字母,例如属性“foo”具有setter方法setFoo:

因此,属性TaskName和taskName的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超类,输出是预期的.

结论:您不能只有两个不同的Objective-C属性第一个字母的情况. Swift编译器应该在这里失败并出现错误(如Objective-C编译器确实).

网友评论