在关闭中找不到成员
Posted
技术标签:
【中文标题】在关闭中找不到成员【英文标题】:Could not find member in closure 【发布时间】:2014-06-04 20:51:02 【问题描述】:我有以下代码。 prompt
是 UIAlertController
。
self.presentViewController(prompt, animated: true, completion:
prompt.textFields[0].becomeFirstResponder()
)
但它给了我这个错误:Could not find member 'becomeFirstResponder'
。
但是,如果我把它放进去就可以了:
self.presentViewController(prompt, animated: true, completion:
let foo = 0
prompt.textFields[0].becomeFirstResponder()
)
为什么当我添加上面这样的无用代码行时错误消失了?
【问题讨论】:
嗯,是的。我是这么想的。我打算为此提交一份错误报告。如果我听到任何消息,我会更新问题。 顺便说一句,出现错误的原因是因为 AnyObject 不知道“becomeFirstResponder”。仍然没有回答为什么 foo 行可以解决这个问题。 @Lucas AnyObject 是从哪里来的?prompt
声明在这段代码的正上方 (var prompt = UIAlertController...
)
@Newbzors 它带有 textFields 数组。由于 textFields 只是一个 NSArray,这意味着它可以容纳任何对象。因此,通过访问该数组的第 0 个索引,它不能推断它是一个 UITextField。同样,这并不能回答为什么 'let foo = 0' 行修复它,我只是说明为什么我认为该行会抛出“找不到成员 'becomeFirstResponder'”错误。
@Lucas 啊,我明白你的意思了
【参考方案1】:
根据 Swift Programming Language 书籍中有关 If 语句和强制展开的部分,
“您可以使用 if 语句来查明可选项是否包含值。如果一个可选项确实有一个值,它的计算结果为真;如果它根本没有价值,它的评估结果为假。 一旦你确定可选项确实包含一个值,你就可以访问它的底层值”
UIAlertController 不必有 textFields,所以因为 textFields
数组是可选的,所以你必须先解开它,然后才能调用数组内的对象上的函数,所以它应该看起来像这样:
self.presentViewController(prompt, animated: true, completion:
if let textFields = prompt.textFields
textFields[0].becomeFirstResponder()
)
【讨论】:
或if let textField = textFields[0]
...这样,如果存在 [0] 元素,您将输入代码块
谢谢你的解释,这对我来说很有意义。无论如何,我向 Apple 报告了一个错误,输入 let foo = 0
不应使错误消失以上是关于在关闭中找不到成员的主要内容,如果未能解决你的问题,请参考以下文章
Discord.py 重写 - 查看成员是不是被服务器静音,在 API 参考中找不到任何信息
在 Android Studio 中找不到 MainActivity.java [关闭]
“GKEntity”类型的值没有成员“componentForClass”。为啥我在 swift 3.0 中找不到这种方法?