这是场景:
这是一个简单的任务管理器应用程序.我在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编译器确实).
