Значения по умолчанию для CGFloat, CGSize, minFontSize и т. д. в функции-оболочке

У меня есть код с кучей вызовов sizeWithFont, от которых мне отчаянно нужно избавиться, так как sizeWithFont устарел. Теперь я вроде как понял, как использовать boundingRectWithSize вместо него, однако вместо повторного выполнения миллиона вызовов я подумал о создании функции-оболочки для выполнения sizeWithFonts.

Итак, вот метод, который я придумал:

- (CGSize) getSizeForCurrentFont:(UIFont*)font
                    forWidth:(CGFloat)width
           constrainedToSize:(CGSize)size
               lineBreakMode:(NSLineBreakMode)lineBreakMode
                 minFontSize:(CGFloat)minFontSize
              actualFontSize:(CGFloat *)actualFontSize
{
    // functionality
}

Что я собираюсь сделать, так это то, что будут вызываться только те значения, которые установлены, а остальные будут такими, какими должны быть значения по умолчанию для них. Итак, если у вызова есть только шрифт и ширина, будет установлено только это. Я понимаю, что fontSize больше не поддерживается, но буду признателен за предложения по этому поводу.

Мой вопрос: каковы значения по умолчанию, которые я должен установить для шрифта, ширины, размера, lineBreakMode, minFontSize и factFontSize, чтобы я не получал странных результатов. По сути, я хочу получить тот же результат для:

[s sizeWithFont:font
constrainedToSize:size];

как с:

[s getSizeForCurrentFont:font 
forWidth:width #This is some Default Value# 
constrainedToSize:size 
lineBreakMode:lineBreakMode #This is some Default Value# 
minFontSize:minFontSize #This is some Default Value# 
actualFontSize: actualFontSize #This is some Default Value#]

Скажите, нужны ли дальнейшие разъяснения. Если вы можете предложить хороший способ сделать boundingRectWithSize, это тоже будет круто.


person gran_profaci    schedule 27.02.2014    source источник


Ответы (3)


Вы могли бы обернуть примитивы в объекты? Итак, у вас будет:

- (CGSize) getSizeForCurrentFont:(UIFont*)font
                    forWidth:(NSNumber*)width
           constrainedToSize:(NSValue*)size
               lineBreakMode:(NSNumber*)lineBreakMode
                 minFontSize:(NSNumber*)minFontSize
              actualFontSize:(NSNumber*)actualFontSize
{
    // functionality
}

Любые значения «по умолчанию» будут равны нулю. Для CGFloat вы должны создать их, используя:

CGFloat value = 10.0f;
NSNumber* valueObj = @(value);

Для NSValue вы можете использовать:

CGSize size = CGSizeMake(10.0f, 10.0f);
NSValue* sizeObj = [NSValue valueWithCGSize:size];

Ключевой вопрос здесь заключается в том, как отличить действительное значение от идентификатора отсутствия. Обычно вы делаете это, используя либо определенную константу (например, NSNotFound), но для перечисленных вами типов такой вещи не существует. Здесь могут помочь объекты, так как отсутствие объекта по своей сути указывает на отсутствие значения.

person WDUK    schedule 27.02.2014
comment
да, я не думаю, что вы даете здесь хороший совет относительно буквальных переменных бокса. - person Grady Player; 28.02.2014
comment
@GradyPlayer Можете ли вы уточнить, почему? - person WDUK; 28.02.2014
comment
вы предлагаете им попробовать @(someStruct), что, безусловно, не работает... и ваша нотация @(CGFloat) сбивает с толку.... - person Grady Player; 28.02.2014
comment
Идея упаковки неплохая, во многих случаях очень актуальна... не критикуя эту стратегию. - person Grady Player; 28.02.2014
comment
Я неправильно понял, я думал, что вы имели в виду, что стратегия была плохой! Не беспокойтесь, отредактировал ответ для ясности. - person WDUK; 28.02.2014

вы можете создать метод:

- (CGSize) sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size {
    [self getSizeForCurrentFont:font 
        forWidth:#some Default Value# 
        constrainedToSize:size 
        lineBreakMode:#some Default Value# 
        minFontSize:#some Default Value# 
        actualFontSize:#some Default Value#]
}

Это самый простой способ создания "значений по умолчанию".

person bealex    schedule 27.02.2014
comment
Хотя это был приведенный пример, у меня сложилось впечатление, что у вас могут быть различные перестановки параметров, а это означает, что создание таких методов было бы немасштабируемым. - person WDUK; 28.02.2014
comment
Эй, большое спасибо. Но я ищу... каким должно быть правильное значение по умолчанию, скажем, для lineBreakMode, который не был установлен. - person gran_profaci; 28.02.2014
comment
Да, это не масштабируется. Да, это не настоящее значение по умолчанию для параметра метода. Но в Objective-C нет параметров по умолчанию. Я считаю, что вы можете использовать их в Objective-C++, но это функция C++, а не Objective-C. - person bealex; 28.02.2014
comment
Ах, теперь я понимаю, что вы имеете в виду. Вам нужно будет выбрать значения по умолчанию для каждого параметра. И поскольку вы контролируете оба метода (полный и короткий), вы можете скрыть это как деталь реализации. Не вижу лучшего решения прямо сейчас. :) - person bealex; 28.02.2014

Обновите Swift 4.2

 let size = CGSize(width: 0, height: 0)
person Puji Wahono    schedule 07.02.2019