如何获取UIColor的所有Color方法?
How to get all Color methods of UIColor?
UIColor
有blackColor
、whiteColor
等颜色方法。我想获得它们的颜色列表,例如:['blackColor','whiteColor'...]
。但是在检查了 method_list
、ivar_list
和 property_list
之后,我发现列表中没有颜色方法。代码在Swift
中写成如下:
//: Playground - noun: a place where people can play
import UIKit
var ivarCount: UInt32 = 0
var propertyCount: UInt32 = 0
var methodCount: UInt32 = 0
let ivars = class_copyIvarList(UIColor.self, &ivarCount)
let properties = class_copyPropertyList(UIColor.self, &propertyCount)
let methods = class_copyMethodList(UIColor.self, &methodCount)
var ivarNames: [String] = []
var propertyNames: [String] = []
var methodNames: [String] = []
for var i = 0; i < Int(ivarCount); ++i {
let ivar = ivars[i]
let name = ivar_getName(ivar)
ivarNames.append(String.fromCString(name)!);
}
for var i = 0; i < Int(propertyCount); ++i {
let p = properties[i]
let name = property_getName(p)
propertyNames.append(String.fromCString(name)!)
}
for var i = 0; i < Int(methodCount); ++i {
let m = methods[i]
let name = sel_getName(method_getName(m))
methodNames.append(String.fromCString(name)!)
}
NSLog("ivars:%@",ivarNames)
NSLog("properties:%@", propertyNames)
NSLog("methods:%@", methodNames)
结果如下:
2016-01-18 11:26:25.531 MyPlayground[42239:4975071] ivar:(
"_systemColorName"
)
2016-01-18 11:26:25.531 MyPlayground[42239:4975071] properties:(
CGColor,
CIColor,
systemColorName
)
2016-01-18 11:26:25.532 MyPlayground[42239:4975071] method:(
"initWithColorLiteralRed:green:blue:alpha:",
classForCoder,
hash,
"isEqual:",
set,
"initWithHue:saturation:brightness:alpha:",
"_getWhite:alpha:",
"_systemColorName",
"initWithWhite:alpha:",
"_getRed:green:blue:alpha:",
"_colorBlendedWithColor:",
styleString,
isPatternColor,
"getHue:saturation:brightness:alpha:",
CIColor,
"initWithPatternImage:",
"_setSystemColorName:",
"_luminance",
"_colorBlendedWithColor:compositingFilter:",
"_isSimilarToColor:withinPercentage:",
"_colorDifferenceFromColor:",
"_luminanceDifferenceFromColor:",
"_colorBlendedWithColors:",
dealloc,
"copyWithZone:",
"encodeWithCoder:",
"initWithCoder:",
cgColor,
"initWithCGColor:",
"initWithRed:green:blue:alpha:",
CGColor,
"getRed:green:blue:alpha:",
setFill,
"colorWithAlphaComponent:",
setStroke,
alphaComponent,
"getWhite:alpha:",
"initWithCIColor:"
)
那是因为颜色方法是 class 方法,它们绑定到 UIColor
的元 class。 class_copyMethodList
returns class 的实例方法作为参数传递。
您可以通过在 UIColor
上调用 object_getClass()
来获取元 class,因此您只需更改一行即可获取 [的所有 class 方法=11=]:
let methods = class_copyMethodList(object_getClass(UIColor.self), &methodCount)
object_getClass()
作用于 Class
值,就像在 Objective-C
中一样,每个 class 都有一个 isa
指针,这使它有资格成为一个对象。
UIColor
有blackColor
、whiteColor
等颜色方法。我想获得它们的颜色列表,例如:['blackColor','whiteColor'...]
。但是在检查了 method_list
、ivar_list
和 property_list
之后,我发现列表中没有颜色方法。代码在Swift
中写成如下:
//: Playground - noun: a place where people can play
import UIKit
var ivarCount: UInt32 = 0
var propertyCount: UInt32 = 0
var methodCount: UInt32 = 0
let ivars = class_copyIvarList(UIColor.self, &ivarCount)
let properties = class_copyPropertyList(UIColor.self, &propertyCount)
let methods = class_copyMethodList(UIColor.self, &methodCount)
var ivarNames: [String] = []
var propertyNames: [String] = []
var methodNames: [String] = []
for var i = 0; i < Int(ivarCount); ++i {
let ivar = ivars[i]
let name = ivar_getName(ivar)
ivarNames.append(String.fromCString(name)!);
}
for var i = 0; i < Int(propertyCount); ++i {
let p = properties[i]
let name = property_getName(p)
propertyNames.append(String.fromCString(name)!)
}
for var i = 0; i < Int(methodCount); ++i {
let m = methods[i]
let name = sel_getName(method_getName(m))
methodNames.append(String.fromCString(name)!)
}
NSLog("ivars:%@",ivarNames)
NSLog("properties:%@", propertyNames)
NSLog("methods:%@", methodNames)
结果如下:
2016-01-18 11:26:25.531 MyPlayground[42239:4975071] ivar:(
"_systemColorName"
)
2016-01-18 11:26:25.531 MyPlayground[42239:4975071] properties:(
CGColor,
CIColor,
systemColorName
)
2016-01-18 11:26:25.532 MyPlayground[42239:4975071] method:(
"initWithColorLiteralRed:green:blue:alpha:",
classForCoder,
hash,
"isEqual:",
set,
"initWithHue:saturation:brightness:alpha:",
"_getWhite:alpha:",
"_systemColorName",
"initWithWhite:alpha:",
"_getRed:green:blue:alpha:",
"_colorBlendedWithColor:",
styleString,
isPatternColor,
"getHue:saturation:brightness:alpha:",
CIColor,
"initWithPatternImage:",
"_setSystemColorName:",
"_luminance",
"_colorBlendedWithColor:compositingFilter:",
"_isSimilarToColor:withinPercentage:",
"_colorDifferenceFromColor:",
"_luminanceDifferenceFromColor:",
"_colorBlendedWithColors:",
dealloc,
"copyWithZone:",
"encodeWithCoder:",
"initWithCoder:",
cgColor,
"initWithCGColor:",
"initWithRed:green:blue:alpha:",
CGColor,
"getRed:green:blue:alpha:",
setFill,
"colorWithAlphaComponent:",
setStroke,
alphaComponent,
"getWhite:alpha:",
"initWithCIColor:"
)
那是因为颜色方法是 class 方法,它们绑定到 UIColor
的元 class。 class_copyMethodList
returns class 的实例方法作为参数传递。
您可以通过在 UIColor
上调用 object_getClass()
来获取元 class,因此您只需更改一行即可获取 [的所有 class 方法=11=]:
let methods = class_copyMethodList(object_getClass(UIColor.self), &methodCount)
object_getClass()
作用于 Class
值,就像在 Objective-C
中一样,每个 class 都有一个 isa
指针,这使它有资格成为一个对象。