Swift中如何让协议仅被UITableViewController类遵循?
让Swift协议仅允许UITableViewController子类遵循的解决方案
要实现你想要的效果——确保FooDelegate协议只能被UITableViewController的子类遵循,你可以通过协议的类型约束来实现,具体写法如下:
import UIKit // 定义协议时添加类约束 + UITableViewController类型限制 protocol FooDelegate: class where Self: UITableViewController { var titleImage: UIImage? { get } }
为什么这样写?
: class约束协议只能被类类型遵循(排除结构体、枚举等值类型),这和UITableViewController的类属性匹配;where Self: UITableViewController直接限定了遵循该协议的类型必须是UITableViewController本身或者它的子类。
验证效果
- 合法情况:继承自
UITableViewController的类可以正常遵循协议,编译通过:
class ViewController: UITableViewController, FooDelegate { var titleImage: UIImage? { // 这里实现你的属性逻辑 return UIImage(named: "title") } }
- 非法情况:非
UITableViewController子类的类尝试遵循协议时,编译器会直接报错:
// 编译错误:Type 'OtherVC' does not conform to protocol 'FooDelegate' // 原因是OtherVC不是UITableViewController的子类 class OtherVC: UIViewController, FooDelegate { var titleImage: UIImage? { return nil } }
这样就能严格保证只有UITableViewController的子类才能实现FooDelegate协议,完全符合你的需求。
内容的提问来源于stack exchange,提问作者hopy
相关产品推荐
相关产品推荐

