【问题标题】:How to properly extend a class with a property of an enum type如何正确扩展具有枚举类型属性的类
【发布时间】:2014-07-18 02:21:56
【问题描述】:

我对 Objective C 和 iOS 开发非常陌生,但我确实对其他几种语言有一点经验。

我目前正在为自己开发一个实验性学习应用程序,我想向 UIButton 添加一个属性。我想添加的属性将是我正在尝试定义的枚举类型,但是我在理解范围方面遇到了一些困难,无法很好地了解在哪里定义枚举以及是否需要 typedef(对 typedef 不太熟悉)还是一样)。

所以,我的问题是我需要在哪里以及如何定义一个枚举,以便能够将枚举用作属性值来扩展作为现有框架一部分的类。满嘴都是……呵呵。

谢谢, 蒂姆

【问题讨论】:

    标签: objective-c enums scope typedef


    【解决方案1】:

    经过编辑以反映所提出的真实问题

    抱歉。您的帖子似乎反映出对 Objective-C 的理解比您真正拥有的更为天真。

    坏消息是向框架中的类扩展添加属性不是你能做的。苹果表示:

    类扩展与类别有一些相似之处,但它只能添加到您在编译时拥有源代码的类中...

    如果子类不能满足您的需求,您可以使用带有关联对象的类别。一个很好的例子是here

    【讨论】:

    • 建议使用 NS_ENUM 宏,而不仅仅是枚举
    • 如果您使用 ARC(可能是 OP),您应该使用 (nonatomic)
    • typedef 在属于框架的类中的什么地方可用?
    • 你想把你的枚举放在一个框架中,让它在一个单独的项目中可用吗?如果是这样,您只需将其放在一个 .h 文件中,然后将#import 该 .h 文件放在您需要的任何位置。
    • 我指的是 UI 框架并使用自定义枚举扩展类 UIButton。我假设我无权访问 UIButton 的 .h 文件.. 所以.. 将枚举添加到任何旧的 .h 文件让我将扩展属性设置为枚举值之一吗? (我希望我在这里使用适当的术语.. 仍然是新手)
    【解决方案2】:

    Apple 提供了一个宏。这增加了最显着的自动完成。

    typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
        UITableViewCellStyleDefault = 0,
        UITableViewCellStyleValue1,
        UITableViewCellStyleValue2,
        UITableViewCellStyleSubtitle
    };
    

    用于不同的值。

    如果您想对选项进行位掩码,其中几个可以一起使用,请使用NS_OPTIONS

    typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
    };
    

    用作位掩码

    UIViewAutoresizing resizing = (UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin)
    

    如果您希望能够从类外部设置,请将其添加到头文件中

    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSUInteger, InsetCellAlignment){
        InsetCellAlignmentLeft,
        InsetCellAlignmentRight
    };
    
    @interface InsetCell : UITableViewCell
    @property InsetCellAlignment alignment;
    @property(nonatomic)CGFloat inset;
    @end
    

    如果您需要以某种状态扩展 UIButton,这强烈表明您没有正确使用 MVC。控制器应该知道状态并分别配置按钮。


    也就是说,您可以使用“关联引用”来获得所需的结果,该引用可用于模拟添加的成员变量。 IMO 它们很臭,我从未使用过它们。

    A category used along with associative references

    【讨论】:

    • 我目前无法访问我的 mac,所以我需要问一下,在任何头文件中创建 NS_ENUM 是否允许我在现有框架中扩展一个类以包含NS_ENUM 的类型并将属性设置为我自己的自定义类之一中的 NS_ENUM 值之一?由于该属性会强制生成 setter/getter,因此我目前似乎遇到了关于它创建的 setter 和使用我在枚举中指定的值之一的错误。顺便说一句,我刚才所说的只是我在原始帖子中试图说的,似乎没有人在解决。
    • 我不确定,你想说什么。但如果您有代码,请将其与您看到的错误一起发布。如果您是子类化,它应该按预期工作,如我上一个代码所示。如果您在谈论类别,您应该知道类别不允许添加任何类型的成员变量。有一些技术可以模仿这些,但这超出了评论和您当前问题的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多