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