Swift Mirror反射不返回UIVIew上的属性

尝试使用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)上运行的.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...