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

ios – 在lowerCamelCase中命名变量时的奇怪行为,第1张

概述在编写Master-Detail应用程序时,我在 Swift中遇到了一个奇怪的行为. 这是场景: 这是一个简单的任务管理器应用程序.我在TaskDetailView上有两个文本控件(TaskName,TaskDescription)和两个字符串变量,它们具有相同的名称,但在TaskDetailViewController中声明的lowerCamelCase(taskName,taskDescrip 在编写master-detail应用程序时,我在 Swift中遇到了一个奇怪的行为.

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

@IBOutlet var Taskname:UITextFIEld!         //UpperCamelCase@IBOutlet var TaskDescription:UITextVIEw!   //UpperCamelCasevar taskname:String?                        //lowerCamelCasevar 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) // barprintln(mc.Prop) // nil

在你的情况下

Taskname.text = ...

设置“taskname”属性,而不是“Taskname”.属性有不同的类型,
所以行为是不确定的.

请注意,只有“Objective-C兼容”属性才会出现此问题.如果删除了
在上面的例子中,NSObject超类,输出是预期的.

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

总结

以上是内存溢出为你收集整理的ios – 在lowerCamelCase中命名变量时的奇怪行为全部内容,希望文章能够帮你解决ios – 在lowerCamelCase中命名变量时的奇怪行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1010552.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存