【问题标题】:Create a Custom Class to Parse a String创建自定义类来解析字符串
【发布时间】:2011-04-02 02:26:36
【问题描述】:

我创建了一个方法,它根据从 NSUserDefaults 中查找的值返回一个字符串。

- (NSString *) getString:(NSInteger *)intID {

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *strMyString;

    if ((int)intID == 1) {
        strMyString = [userDefaults stringForKey:kSomeStuff];
    } else {
        strMyString = [userDefaults stringForKey:kSomeOtherStuff];
    }

    // ... do a bunch of string parsing
    return strMyString; 
}

效果很好。除了我在六个不同的视图控制器类中复制了这个方法。对于可以由所有各种视图控制器共享的自定义类来说,这似乎是一个完美的案例。但我不知道该怎么做。 任何帮助表示赞赏! lq

【问题讨论】:

    标签: iphone objective-c xcode class-design


    【解决方案1】:

    这将是category on NSUserDefaults 的完美使用。然后你可以有这样的方法:

    - (NSString *)someStuff {
        return [self stringForKey:kSomeStuff];
    }
    
    - (NSString *)someOtherStuff {
        return [self stringForKey:kSomeOtherStuff];    
    }
    

    然后,当您需要这些值时,您只需编写:

    [[NSUserDefaults standardUserDefaults] someStuff];
    

    【讨论】:

    • 谢谢亚历克斯。但在这种情况下,[//... 做一堆字符串解析] 是大量的字符串操作。但我会记住这一点以备将来使用。
    • 所以把它放在NSString 的类别中的类方法中。重点是,我不建议在这里使用子类,因为您似乎不需要创建它的实例。
    【解决方案2】:

    一个简单的解决方案是添加一个继承自NSObject 的类(命名为“StringMangler”或其他),并将您的(希望)无状态便捷方法作为静态方法放在那里:

    + (NSString *) getString:(NSInteger *)intID {
    

    在您的视图控制器中,#import "StringMangler.h" 然后调用

    [StringMangler getString:myID];
    

    【讨论】:

    • 抱歉这个菜鸟问题,但这一切都在 StringMangler.h 中,没有随附的 StringMangler.m ?
    • 是的,劳伦 Quantrell。 StringMangler.h 就足够了,另外你必须创建一个 StringMangler 类的对象,通过它你可以访问方法 getString:
    • @PARTH:您的编辑绝对不是我想要的。静态方法的重点是避免仅仅为了进行一行无状态方法调用而创建和释放对象的麻烦。
    • @Lauren:您的 getString 方法将放在 StringMangler.m 中,方法签名的原型放在 StringMangler.h 中。那么在任何需要调用getString的类中,你只需要#import.h文件即可。
    • @MusiGenesis:对不起,我误解了您的回答并进行了编辑。但是创建静态方法并不是一个好主意。当你想使用它时,最好创建和释放对象。这使您可以扩展使用该方法。毕竟,如果你知道内存管理的概念,那么创建和释放对象有什么问题呢?
    【解决方案3】:

    例如,创建一个自定义类并将其命名为 UserDefaultsHelper。将您编写的所有代码用于处理读取和写入到 NSUserDefaults。然后,当您需要访问该信息时,只需在所有控制器中使用此自定义。这样,如果您需要进行更改,您只有一个地方可以查看。

    【讨论】:

      【解决方案4】:

      你只需要一个函数:

      NSString * MONIdentifiedStringForID(NSInteger intID) {
          NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
          NSString * s = nil;
          if (intID == 1) {
              s = [userDefaults stringForKey:kSomeStuff];
          }
          else {
              s = [userDefaults stringForKey:kSomeOtherStuff];
          }
          assert(s);
          /* ... do a bunch of string parsing */
          return s;
      }
      

      如果您的类没有关系,那么您可以根据需要简单地包装它:

      - (NSString *)getString:(NSInteger)intID {
          return MONIdentifiedStringForID(intID);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-03
        • 2014-02-13
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多