2015-02-23 3 views
-1

Этот код от Sams Teach Yourself Swift книгу, Глава 21. Song.h файл содержит следующий код:Я не понимаю Objective-C Инициализатор для класса.

//Song.h 
#import <Foundation/Foundation.h> 
@interface Song : NSObject; 
@property (nonatomic, copy) NSString *title; 
@property (nonatomic, copy) NSString *artist; 
@property (nonatomic, strong) NSNumber *rating; 
- (instancetype)initWithTitle:(NSString *)title artist:(NSString *)artist rating:(NSNumber *)number; 
@end 

В моем понимании - (instancetype) создает метод экземпляра, возвращающую instancetype. Два (NSString *) s объявят, что параметр будет NSString. Я предполагаю, что слово title сразу после первого (NSString *) - это имя параметра, то же самое с artist, следующего за (NSString *). Что такое initWithTitle: и artist:?

+0

Благодарим за помощь! –

ответ

1

Вы в значительной степени должны это правильно.

Метод экземпляра Obj-C начинается с дефиса, «-», за которым следует тип возврата в круглых скобках. Метод класса, начинающийся с плюса «+», но в остальном тот же.

За этим следует остальная часть сигнатуры метода, которая может включать в себя несколько параметров. Каждому параметру предшествует двоеточие «:», а затем требуемый тип аргумента/параметра в круглых скобках, например. NSString *, за которой следует, наконец, внутреннее имя для значения, которое будет передано в Читаешь полное имя метода, заявив, каждый параметр ...

initWithTitle:artist:rating

Чтение как предложение, вы говорите.:

"Inititialize экземпляр песни с названием (это NSString *), художник (также NSString *) и рейтинг (для этого требуется NSNumber *)"

-(returnType)firstPartofMethodNameThatTakestheArgument:(NSString *)argument1 andArgumentTwo:(NSString *)argument2

instanceType является относительно новой альтернативой для id, что означает, что тип возврата может быть любым. Это вместо этого гарантирует, что это может быть только экземпляр типа, содержащего метод, в данном случае Song.

Что касается повторяющихся имен аргументов ... Первая часть «artist: - это внешнее имя, которое появляется при вызове метода (если вы используете, например, завершение кода, это то, что отображается). Часть после типа аргумента (NSString *)artist является внутреннего имени, которое будет использоваться в реализации методы. Те, могут быть одинаковыми, но они не должны быть.

Swift имеет аналогичную конструкцию, но с большим количеством опций, где вы можете выбрать писать разные внутренние и внешние имена параметров или просто использовать 1 (или использовать параметры вывода, чьи значения возможны, использовать переменные параметры, которые могут быть произвольным числом элементов, и т. д. - посмотреть в Swift Functions для более подробной информации по этим темам).

func initWith(externalTitle internalTitle:String, #artist:String, #rating:Int) -> Song 

//When calling, you'd see "externalTitle:artist:rating" 
//but in the method implementation you'd use "internalTitle" instead. 
1

instancetype является заменой для id (а на самом деле компилятора кроющих id в instancetype для инициализации методов во время компиляции) или определенного класса типа обычно возвращаемых методами инициализации и не может быть использован в любом другом месте. Это позволяет компилятору проверить, что назначения из этого метода init являются подходящим типом, но при этом подклассы наследуют инициализаторы. Таким образом, этот метод init, скорее всего, принимает начальные значения и присваивает их свойствам.

1

Подпись метода . Другими словами, именно так используется метод с именем.


КПП. «instancetype» - это ключевое слово компилятора, представляющее тип экземпляра, поэтому на самом деле метод вернет экземпляр песни.

1

- initWithTitle:artist:rating: - это имя метода или в терминах Objective-C, селектор. title, artist и rating - это имена параметров.

Что касается - (instancetype), знак минус - означает, что это метод экземпляра (методы класса начинаются со знаком плюс +), в то время как instancetype является тип возвращаемого значения метода. Это просто ключевое слово, которое сообщает компилятору, что этот метод всегда будет возвращать объект типа класса, на котором он был вызван. Если вы хотите узнать больше об этом, я предлагаю прочитать NSHipster post about instancetype.

1

Вы сказали:

В моем понимании - (instancetype) создает метод экземпляра, возвращая instancetype.

- обозначает метод экземпляра. instancetype - специальное ключевое слово, обозначающее, что в этом случае возвращает экземпляр класса, экземпляр Song.

Два (NSString *) ы объявить, что параметр будет NSString.

Да, две ссылки (NSString *) указывают, что первые два параметра являются строковыми значениями. Следующий (NSNumber *) указывает, что третий параметр является числовым объектом.

Я предполагаю, что слово титул сразу после первой (NSString *) это имя параметра, то же самое с художником после (NSString *). Что такое initWithTitle: и artist:?

Слово сразу после (NSString *) является именем параметра, используемого при реализации этого метода.

Рассмотрим объявление:

- (instancetype)initWithTitle:(NSString *)title artist:(NSString *)artist rating:(NSNumber *)number; 

Объявляет метод, называемый initWithTitle:artist:rating:, который принимает три параметра: название, исполнитель, и рейтинг. Так что если вы хотите создать песню под названием «Ticket To Ride» по «Битлз» и рейтингом 5, вы могли бы назвать этот метод что-то вроде:

Song *song = [[Song alloc] initWithTitle:@"Ticket to Ride" artist:@"Beatles" rating:@5]; 
+1

Fix метод name описание пожалуйста. Он имеет несмежное имя, в котором явно указаны имена параметров. Похоже, быстрые соглашения об именах ползут :) –

+0

Спасибо, что указали это. – Rob

 Смежные вопросы

  • Нет связанных вопросов^_^