как расширить протокол для делегата в задаче C, а затем создать подкласс для объекта, требующего соответствующего делегата

Webpack не знает, чтобы разрешить файлы .jsx неявно. Вы можете указать расширение файла в своем приложении (import App from './containers/App.jsx';). Тест текущего загрузчика говорит о том, что вы используете загрузчик babel, когда вы явно импортируете файл с расширением jsx.

или вы можете включить .jsx в расширения, которые веб-пакет должен разрешить без явного объявления:

module.exports = {
  entry: './index.jsx',
  output: {
    filename: 'bundle.js'
  },
  module: {
    loaders: [{
      test: /\.jsx?$/,
      exclude: /node_modules/,
      loader: 'babel',
      query: {
        presets: ['es2015', 'react']
      }
    }]
  },
  resolve: {
    extensions: ['', '.js', '.jsx'],
  }
};

Для Webpack 2 оставьте пустое расширение.

resolve: {
  extensions: ['.js', '.jsx']
}
30
задан ROMANIA_engineer 12 December 2017 в 22:21
поделиться

2 ответа

UITextView определяет свой делегат как

@property(nonatomic, assign) id<UITextViewDelegate> delegate

, что означает, что он соответствует UITextViewDelegate , и это проверяет компилятор. Если вы хотите использовать новый протокол, вам необходимо переопределить делегат , чтобы он соответствовал вашему протоколу:

@interface MySubClass : UITextView {
}
@property(nonatomic, assign) id<MySubClassDelegate> delegate   
@end

Компилятор больше не должен выдавать предупреждений.

[Обновление от fess]

... Этим компилятор предупредит, что аксессоры должны быть реализованы ... [Я реализовал это:]

-(void) setDelegate:(id<MySubClassDelegate>) delegate {
[super setDelegate: delegate];
}
- (id) delegate {
return [super delegate];
}

"

[Мое обновление]

Я считаю, что это должно сработать, если вы только сделаете объявление @dynamic вместо повторной реализации метода, поскольку реализация уже существует:

@dynamic delegate;
25
ответ дан 27 November 2019 в 22:40
поделиться

Учитывая, что MySubClassMessage: не является обязательным, у вас должна быть возможность просто сделать простое:

- (void) SomeMethod { 
  SEL delegateSelector = @selector(MySubClassMessage:);
  if ([self.delegate respondsToSelector:delegateSelector]) { 
    [self.delegate performSelector:delegateSelector withObject:self];
  }
}

Компилятор должен по-прежнему проверять, соответствует ли реализующий класс вашему протоколу (или, по крайней мере, утверждать, что в заголовок), и вы не получите описанную вами ошибку.

1
ответ дан 27 November 2019 в 22:40
поделиться