Swift开发报错:Declaration is only valid at file scope问题求助
解决「Declaration is only valid at file scope」错误的方案
嘿,我一眼就揪出问题所在啦!你碰到的这个错误,根源是把Swift扩展嵌套到了类的方法内部——Swift的扩展必须定义在文件顶级作用域(也就是和你的ViewController类同一层级,不能放在任何函数/方法里面)。
具体问题分析
你现在把extension ViewController: UITextFieldDelegate写在了touchesBegan方法的大括号里,这完全违反了Swift的语法规则,编译器自然会报错。另外,viewDidLoad里的强制类型转换(self as! UITextFieldDelegate)也是多余的,只要类遵循了协议,直接用self就行。
修改后的完整代码
class ViewController: UIViewController { // inputs @IBOutlet weak var creditValueInput: UITextField! //wartość kredytu, input @IBOutlet weak var procentageInput: UITextField! //oprocentowanie, input @IBOutlet weak var yearsInput: UITextField! //ile lat/miesiecy, input @IBOutlet weak var creditOverallOutput: UILabel! @IBOutlet weak var creditCalculationOutput: UILabel! override func viewDidLoad() { super.viewDidLoad() // 去掉多余的强制类型转换,直接赋值self即可 self.creditValueInput.delegate = self self.procentageInput.delegate = self self.yearsInput.delegate = self // Do any additional setup after loading the view. } // ...... 你的其他方法代码 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { creditValueInput.resignFirstResponder() procentageInput.resignFirstResponder() yearsInput.resignFirstResponder() // ...... 你的其他touchesBegan逻辑 } } // 把扩展移到ViewController类的外面,放在文件作用域下 extension ViewController: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } }
额外小提示
你也可以选择直接在类的定义时就声明遵循UITextFieldDelegate,这样就不用单独写扩展了,写法如下:
// 直接在类定义时遵循协议 class ViewController: UIViewController, UITextFieldDelegate { // 类内部代码不变 override func viewDidLoad() { super.viewDidLoad() self.creditValueInput.delegate = self // ... 其他代码 } // 直接把textFieldShouldReturn方法写在类内部 func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } }
两种写法都是合规的,看你个人代码风格偏好就行。
内容的提问来源于stack exchange,提问作者Saq
相关产品推荐
相关产品推荐

