[背景]
swift代码:
func setViewControllers(newViewControllers:NSArray) {
出错:
Method ‘setViewControllers’ with Objective-C selector ‘setViewControllers:’ conflicts with setter for ‘viewControllers’ with the same Objective-C selector
如图:
[解决过程]
1.后来点击右边的红色点,调转到上面的定义:
var viewControllers = [UIViewController]()
如图:

看起来很明显了:
此处由于有了变量(属性)的viewControllers定义
-》系统自动生成了其getter和setter
-》对应的setter就是:setViewControllers
-》而此处自己实现了
func setViewControllers(newViewControllers:NSArray) {
所以和系统内部生成的冲突了。
-》感觉是:要么自己把这个函数改名,要么去声明是override
-》直接前面加override就可以了?去试试
2.先去搜搜吧
swift Method setViewControllers with Objective-C selector setViewControllers: conflicts with setter for viewControllers with the same Objective-C selector
参考:
没有完全的看懂。
但是决定参考那个做法,去直接改名字算了。
3.但是觉得好像不对:
原先的OC的代码就是:
.h:
@property (nonatomic, copy) NSArray *viewControllers; - (void)setSelectedViewController:(UIViewController *)viewController animated:(BOOL)animated;
.m
- (void)setViewControllers:(NSArray *)newViewControllers { }
然后对于:
setViewControllers
也没有其他地方调用:

应该是:
其本意就是:
setViewControllers重写override这个viewControllers
(后来才看到demo中的调用:
NSArray *viewControllers = @[listViewController1, listViewController2, listViewController3]; MHTabBarController *tabBarController = [[MHTabBarController alloc] init]; tabBarController.delegate = self; tabBarController.viewControllers = viewControllers;
证实了我的猜想)
所以,此处的Swift中也需要:
搞清楚,如何override这个viewControllers
4.搜:
swift how override setter
参考:
官网也没有给出setXXX的例子。。
自己去试试
5.突然看到,自己此处的代码是:
var viewControllers = [UIViewController]() func setViewControllers(newViewControllers:NSArray) {
应该是:
参数NSArray而不是UIViewController
改为UIViewController估计就可以了。
去试试。
func setViewControllers(newViewControllers:UIViewController) {
结果错误依旧。
6.再去加上override:
override func setViewControllers(newViewControllers:UIViewController) {
结果又:
Method does not override any method from its superclass
7.搜:
swift override property setter
参考:
8.好像又搞错了:
var viewControllers = [UIViewController]()
参数应该是数组才对?
试试:
func setViewControllers(newViewControllers:[UIViewController]) {
错误依旧。
加了override:
override func setViewControllers(newViewControllers:[UIViewController]) {
又是:
Method does not override any method from its superclass
9.后来终于在官网中:
看到了,如何重写setter,其实就是:
Property Observers
然后是用Property Observers去管理属性的值:
每次属性的值变化了:被设置了一个新值,即是新值和旧值是一样的,也就被调用
会在新的值被存储之前被调用:willSet
在新的值被存储之后立刻调用:didSet
需要实现对应的,监视值的变化,重写值的setter,则可以去实现对应的wilSet和(,或)didSet
那此处,去折腾willSet和didSet
结果又出现错误:
转载请注明:在路上 » [已解决]Swift代码出错:Method setViewControllers with Objective-C selector setViewControllers: conflicts with setter for viewControllers with the same Objective-C selector