Nano Hash - криптовалюты, майнинг, программирование

Как правильно отформатировать сигнатуру метода Objective-C с аргументами?

Я веб-дизайнер/разработчик, который наконец-то решил попробовать свои силы в Objective-C. Я твердо верю в стандарты и придерживаюсь любых руководящих принципов, форматов или неписаных правил, установленных языком, вместо того, чтобы пытаться навязать свое собственное представление о том, как это должно быть сделано, или использовать свои собственные методы (каламбур не предназначен, но я буду смирись с этим). Другими словами, я открыт для написания кода с camelCaseVarNames или underscore_var_names; Я просто хотел бы знать, что "общепринято" делается на указанном языке.

В любом случае, я хотел бы знать, как правильно написать метод Objective-C, особенно при расширении существующего класса. И заметьте, я делаю маленькие шаги, поэтому я не беспокоюсь о шаблонах проектирования MVC или любом другом «разделении интересов» прямо сейчас. Я работаю в файле реализации по умолчанию AppDelegate (да, я крутой). Мне нравится думать, что это эквивалентно написанию набора стилей в <head> файла HTML при изучении CSS; Я просто пытаюсь понять, что делает эта кнопка и что делает та кнопка. Есть смысл?

Хорошо, вот сценарий. Скажем, вы хотите написать простой метод, который проверяет, принадлежит ли представление к определенному классу. Я уверен, что есть много способов сделать это (и, возможно, каждый NSObject имеет эту возможность без необходимости в такой функции), но развеселите меня. Вот что у меня получилось (смейтесь):

- (BOOL)viewInstance:(id)view isOfClass(NSString *)className
{
    return ( [view class] == NSClassFromString(className) );
}

У меня проблема в том, что viewInstance: сам по себе довольно бессмысленный, и, судя по тому, что я читал, Objective-Cer любит superRichAndDescriptiveMethodNamesThatAreSelfDocumenting. При этом полное имя метода включает вторую часть — я предполагаю, что вторая часть является именованным аргументом или параметром. Так что, когда читаешь вместе, это на самом деле имеет немного смысла. Реальным примером того, о чем я говорю, является метод colorWithDeviceRed NSColor. Я просмотрел список завершения всплывающих окон 20 раз, прежде чем понял, что Red: был первым параметром! Полная декларация:

+ (NSColor *)colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha

Думаю, я просто запутался в том, когда и/или как называть функции определенным образом. Кроме того, меня смущает инициализация объектов. На языках, которые я знаю, я бы создал такой массив:

// JavaScript
var myArray = [ 1, 2, 3 ];

// PHP
$my_array = array( 1, 2, 3 );

// AppleScript
set myArray to { 1, 2, 3 }

// ActionScript
var myArray:Array = new Array( 1, 2, 3 );

// Python
my_array = [ 1, 2, 3 ]

// P.S. I add spaces between brackets because I'm a special boy, so no judgments.

В Objective-C я никогда не знаю, что использовать:

NSArray *myArray = [NSArray new];
NSArray *myArray = [NSArray array];
NSArray *myArray = [[NSArray alloc] init];
NSArray *myArray = [[NSArray alloc] initWithArray:@[1,2,3]];
NSArray *myArray = [NSArray arrayWithArray:@[1,2,3]];
NSArray *myArray = @[1,2,3];

Литерал массива меня меньше всего пугает, потому что он больше всего подходит для других языков. Чего я действительно не понимаю, так это того, как в приведенных выше утверждениях есть метод initWithArray и метод arrayWithArray. Хм. Вызывает ли он один и тот же базовый метод?

Меня на самом деле смущает следующее:

[[NSDictionary alloc] initWithDictionary:(NSDictionary)]
[[NSDictionary alloc] initWithDictionary:(NSDictionary) copyItems:(bool)]

Посмотрев на заголовочный файл для NSDictionary, он выглядит как два отдельных метода. Я привык видеть необязательные аргументы, такие как:

function initWithObject(object, copyItems) {
    var obj = {};
    if ( copyItems ) {
        ...
    }
    return obj;
}

В моем примере у меня будет необязательный аргумент, который при включении изменит поток функции. Я, вероятно, совершенно не прав насчет двух методов, но из того немногого, что я знаю о Objective-C, это выглядит так. Тем не менее, я не собираюсь убегать только потому, что я маленький интернет-любитель. Да, немного пугает то, что я могу засыпать темы и писать такие вещи, как NSTerminateNow, но я думаю, с вашей помощью, ребята, я действительно мог бы кое-чему научиться. Так что, пожалуйста, научите меня!

Мои тексты иногда могут быть немного многословными, так что спасибо, что дочитали до конца.


Ответы:


1

Этот вопрос немного не сфокусирован на Stack Overflow, но у вас есть несколько четких вопросов. Что касается стандартов кодирования, начните с прочтения рекомендаций Apple и посмотрите исходный код Apple. Старайтесь всегда читать методы с их полными сигнатурами. NSColor colorWithDeviceRed:green:blue:alpha: -- так их понимает компилятор.

Инициализация коллекций теперь является реликтом, поскольку ARC обрабатывает выпуск/сохранение, в основном использование формата «init» вернет сохраненный объект, а методы класса [NSArray array] вернут автоматически выпущенный. Я бы использовал @[ ], так как он короткий и понятный.

Что касается вопроса создания экземпляра словаря, инициализация одного словаря другим приводит к тому, что объекты, содержащиеся в A, теперь также содержатся в B. Если вы действительно хотите, чтобы копии объекта, содержащегося в A, попадали в B, initWithDictionary:copyItems: выполнит (поверхностный) копия этих предметов.

NSMutableString *someString = [@"abc" mutableCopy];
NSDictionary *a = @{ @"key" : someString };
NSDictionary *b1 = [[NSDictionary alloc] initWithDictionary:a];
NSDictionary *b2 = [[NSDictionary alloc] initWithDictionary:a copyItems:YES];

[someString appendString:@"def"];
// b1[@"key"] == abcdef
// b2[@"key"] == abc
// Note also that b1[@"key"] will be a mutablestring, b2[@"key"] will not

Как правило, вам не нужно копировать, если вы не знаете, что вам нужно копировать. Удачи!

19.09.2013
  • Вы убрали последнее двоеточие из -[NSColor colorWithDeviceRed:Green:Blue:Alpha:] и -initWithDictionary:copyItems:. 19.09.2013
  • Привет, @ben и @ken, это Бен. Спасибо, ребята! Извините, что не сосредоточил внимание на вопросе (ах?) Лучше. Когда я нахожусь в режиме кода, мне трудно извлекать связные мысли. Хотя, Бен, ты проделал хорошую работу, просеяв мою чепуху. В то время все казалось таким чуждым, но после того, как я поработал с этим, все начинает налаживаться. [benFlynnReceiverObject sendMessage:@"I'm gettin' the hang of it now. See?" Еще раз спасибо. 30.09.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..