Как я нахожу все ключи свойства совместимого объекта Objective C KVC?

Это частично реализовано в фундаменте 5.

в _type.scss у них есть два набора переменных заголовка

// We use these to control header font sizes
//for medium screens and above

$h1-font-size: rem-calc(44) !default;
$h2-font-size: rem-calc(37) !default;
$h3-font-size: rem-calc(27) !default;
$h4-font-size: rem-calc(23) !default;
$h5-font-size: rem-calc(18) !default;
$h6-font-size: 1rem !default;


// We use these to control header size reduction on small screens
$h1-font-reduction: rem-calc(10) !default;
$h2-font-reduction: rem-calc(10) !default;
$h3-font-reduction: rem-calc(5) !default;
$h4-font-reduction: rem-calc(5) !default;
$h5-font-reduction: 0 !default;
$h6-font-reduction: 0 !default;

. Для средних значений они генерируют размеры на основе первого набора из переменных.

@media #{$medium-up} {
      h1,h2,h3,h4,h5,h6 { line-height: $header-line-height; }
      h1 { font-size: $h1-font-size; }
      h2 { font-size: $h2-font-size; }
      h3 { font-size: $h3-font-size; }
      h4 { font-size: $h4-font-size; }
      h5 { font-size: $h5-font-size; }
      h6 { font-size: $h6-font-size; }
    }

И для маленьких по умолчанию экранов они используют второй набор переменных для генерации css.

h1 { font-size: $h1-font-size - $h1-font-reduction; }
h2 { font-size: $h2-font-size - $h2-font-reduction; }
h3 { font-size: $h3-font-size - $h3-font-reduction; }
h4 { font-size: $h4-font-size - $h4-font-reduction; }
h5 { font-size: $h5-font-size - $h5-font-reduction; }
h6 { font-size: $h6-font-size - $h6-font-reduction; }

вы можете использовать эти переменные и переопределить в своем обычном scss-файл для установки размеров шрифта для соответствующих размеров экрана

25
задан Quinn Taylor 30 June 2009 в 08:45
поделиться

5 ответов

#import "objc/runtime.h"

unsigned int outCount, i;

objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for(i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    const char *propName = property_getName(property);
    if(propName) {
            const char *propType = getPropertyType(property);
            NSString *propertyName = [NSString stringWithUTF8String:propName];
            NSString *propertyType = [NSString stringWithUTF8String:propType];
    }
}
free(properties);
38
ответ дан Julian F. Weinert 28 November 2019 в 21:13
поделиться

Не существует такого метода, поскольку система KVO не требует, чтобы объекты / классы регистрировались в ней, для каких свойств они поддерживают KVO. Любой ключ может потенциально поддерживать KVO, единственный способ узнать это из документации автора.

И, конечно, нет гарантии, что @property будет поддерживать КВО; вполне возможно написать свойство, которое не (и иногда может быть необходимо). Таким образом, получение списка @property класса, а затем предположить, что они соответствуют KVO, было бы опасным выбором, на мой взгляд.

1
ответ дан Mike Abdullah 28 November 2019 в 21:13
поделиться

Вам нужна функция getPropertyType. Смотрите этот пост: Получить список атрибутов объекта в Objective-C

0
ответ дан Community 28 November 2019 в 21:13
поделиться

Для наблюдателей Swift вы можете получить эту функцию, используя функцию Encodable. Я объясню, как:

  1. Соответствовать вашему объекту протоколу Encodable

    class ExampleObj: NSObject, Encodable {
        var prop1: String = ""
        var prop2: String = ""
    }
    
  2. Создать расширение для Encodable, чтобы предоставить toDictionary функциональность

     public func toDictionary() -> [String: AnyObject]? {
        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted
        guard let data =  try? encoder.encode(self),
              let json = try? JSONSerialization.jsonObject(with: data, options: .init(rawValue: 0)), let jsonDict = json as? [String: AnyObject] else {
            return nil
        }
        return jsonDict
    }
    
  3. Вызовите toDictionary для вашего экземпляра объекта и получите доступ к свойству keys.

    let exampleObj = ExampleObj()
    exampleObj.toDictionary()?.keys
    
  4. Вуаля! Получите доступ к вашей недвижимости следующим образом:

    for k in exampleObj!.keys {
        print(k)
    }
    // Prints "prop1"
    // Prints "prop2"
    
-1
ответ дан Harry Bloom 28 November 2019 в 21:13
поделиться

Использовать class_getPropertyList . Это расскажет вам все @properties объекта.

Он не обязательно перечислит каждое KVC-совместимое свойство, потому что любой метод, который не принимает аргументов и возвращает значение, является действительным KVC-совместимым добытчик. Для среды выполнения нет 100% надежного способа узнать, какие из них ведут себя как свойства (например, - [Длина NSString] ), а какие - как команды (например, - [NSFileHandle readDataToEndOfFile] ).

В любом случае вы должны объявить ваши KVC-совместимые свойства как @properties , так что это не должно быть слишком большой проблемой.

3
ответ дан 28 November 2019 в 21:13
поделиться