尝试使用follownig获取UIView或UIViewController的所有属性:
func propertysNames()->[String]{ var s = [String]() for c in Mirror(reflecting: self).children { if let name = c.label{ s.append(name) } } return s }
这适用于UIVIewController,但UIView似乎没有返回属性,任何建议?
不知道你想要实现什么,但UIView继承了NSObject.因此,您可以使用大量的objc运行时.因此,作为替代方案,您可以执行以下操作:
import UIKit extension NSObject { func propertysNames() -> [String]{ var count : UInt32 = 0 let classToInspect = self.dynamicType let properties : UnsafeMutablePointer <objc_property_t> = class_copyPropertyList(classToInspect,&count) var propertyNames : [String] = [] let intCount = Int(count) for var i = 0; i < intCount; i++ { let property : objc_property_t = properties[i] let propertyName = NSString(UTF8String: property_getName(property))! propertyNames.append(propertyName as String) } free(properties) return propertyNames } } print(UIView().propertysNames()) // prints: "["_mayRemainFocused","_sensitivitySize","skipsSubviewEnumeration","viewTraversalMark","viewDelegate","monitoRSSubtree","backgroundColorSystemColorName","currentScreenScale","maskView","_userInterfaceIdiom","hash","superclass","description","debugDescription","gesturesEnabled","deliversTouchesForGesturesToSuperview","deliversButtonsForGesturesToSuperview","_shouldReverseLayoutDirection","leadingAnchor","trailingAnchor","leftAnchor","rightAnchor","topAnchor","bottomAnchor","widthAnchor","heightAnchor","centerXAnchor","centerYAnchor","firstBaselineAnchor","lastBaselineAnchor","_keyboardOrientation","_touchForceObservable","_inheritedRenderConfig","_lightStyleRenderConfig","_accessoryViewFrame","unsatisfiableConstraintsLoggingSuspended","userInteractionEnabled","tag","layer","focused","semanticContentAttribute","interactionTintColor","_layoutDebuggingIdentifier","_countOfMotionEffectsInSubtree","_maskView","_ancestorDefinesTintColor","_ancestorDefinesTintAdjustmentMode","_presentationControllerToNotifyOnLayoutSubviews","_rawLayoutMargins","_inferredLayoutMargins","_dontUpdateInferredLayoutMargins","_tracksFocusedAncestors","_countOfFocusedAncestorTrackingViewsInSubtree","_mutableLayoutGuides","_mutableLayoutArrangements","_hiddenManagedByLayoutArrangementCount","_pendingHiddenCount","previewingSegueTemplateStorage","_continuousCornerRadius","_canBeParentTraitEnviroment","_layoutEngine","_boundsWidthVariable","_boundsHeightVariable","_minXVariable","_minYVariable","_internalConstraints","_constraintsExceptingSubviewAutoresizingConstraints","_shouldArchiveUIAppearanceTags","_interactionTintColor","_backdropMaskViewForGrayscaleTint","_backdropMaskViewForColorTint","_backdropMaskViewForFilters","_backdropMaskViews","_wantsGeometryChangeNotification","contentSizeNotificationToken","layoutMarginsGuide","readableContentGuide","traitCollection","preferredFocusedView","center","bounds","transform","collisionBoundsType","collisionBoundingPath"]\n"
此外,我确实看到一些将您的代码应用于UIKit对象的奇怪之处.不确定导致失败的变量是什么.它似乎在用Swift编写的NSObject类型上工作正常:
import UIKit class Fruit { var type=1 var name="Apple" var delicIoUs=true } var s = [String]() for c in Mirror(reflecting: Fruit()).children { if let name = c.label{ s.append(name) } } print(s) // works: "["type","name","delicIoUs"]\n" class FruitNSObject: NSObject { var type:NSNumber=1 var name:NSString="Apple" var delicIoUs=true } s = [String]() for c in Mirror(reflecting: FruitNSObject()).children { if let name = c.label { s.append(name) } } print(s) // works: "["type","delicIoUs"]\n" s = [String]() for c in Mirror(reflecting: UIView()).children { if let name = c.label { s.append(name) } } print(s) // doesn't work: "[]\n" s = [String]() for c in Mirror(reflecting: UIViewController()).children { if let name = c.label { s.append(name) } } print(s) // doesn't work: "[]\n"
所以要么这是一个bug,要么在Swift< - >中有一些限制. ObjC在当前版本的Swift中.也许这与@ user3441734在他的回答中指出的有关.
顺便说一句,所有代码都是在操场上最新版本的Xcode(即7.1.1)上运行的.