Это частично реализовано в фундаменте 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-файл для установки размеров шрифта для соответствующих размеров экрана
#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);
Не существует такого метода, поскольку система KVO не требует, чтобы объекты / классы регистрировались в ней, для каких свойств они поддерживают KVO. Любой ключ может потенциально поддерживать KVO, единственный способ узнать это из документации автора.
И, конечно, нет гарантии, что @property
будет поддерживать КВО; вполне возможно написать свойство, которое не (и иногда может быть необходимо). Таким образом, получение списка @property
класса, а затем предположить, что они соответствуют KVO, было бы опасным выбором, на мой взгляд.
Вам нужна функция getPropertyType. Смотрите этот пост: Получить список атрибутов объекта в Objective-C
Для наблюдателей Swift вы можете получить эту функцию, используя функцию Encodable
. Я объясню, как:
Соответствовать вашему объекту протоколу Encodable
class ExampleObj: NSObject, Encodable {
var prop1: String = ""
var prop2: String = ""
}
Создать расширение для 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
}
Вызовите toDictionary
для вашего экземпляра объекта и получите доступ к свойству keys
.
let exampleObj = ExampleObj()
exampleObj.toDictionary()?.keys
Вуаля! Получите доступ к вашей недвижимости следующим образом:
for k in exampleObj!.keys {
print(k)
}
// Prints "prop1"
// Prints "prop2"
Использовать class_getPropertyList . Это расскажет вам все @properties
объекта.
Он не обязательно перечислит каждое KVC-совместимое свойство, потому что любой метод, который не принимает аргументов и возвращает значение, является действительным KVC-совместимым добытчик. Для среды выполнения нет 100% надежного способа узнать, какие из них ведут себя как свойства (например, - [Длина NSString]
), а какие - как команды (например, - [NSFileHandle readDataToEndOfFile]
).
В любом случае вы должны объявить ваши KVC-совместимые свойства как @properties
, так что это не должно быть слишком большой проблемой.