在关闭中找不到成员

Posted

技术标签:

【中文标题】在关闭中找不到成员【英文标题】:Could not find member in closure 【发布时间】:2014-06-04 20:51:02 【问题描述】:

我有以下代码。 promptUIAlertController

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 中找不到这种方法?

在 tesseract 中找不到 Lib 错误 [关闭]

在 swift ui 中找不到 PopUpButtonPickerStyle [关闭]