【问题标题】:Edit individual chars in Objective-C在 Objective-C 中编辑单个字符
【发布时间】:2013-05-21 19:11:30
【问题描述】:

我正在学习 Cocoa/Objective-C,我正在尝试修改 NSString 并编辑字符串中的单个字符。我已经设法将其更改为一个字符数组,然后将其更改回来,但是当我尝试执行 c[0] = 'b' 时,它说,“只读变量不可分配”。我已经包含了 .m 文件和 .h 文件。

这是 .m 文件:

import "AppDelegate.h"

@implementation AppDelegate

@synthesize textField, myLabel;

-(IBAction)changeLabel:(id)sender {
    NSString *message = [[NSString alloc] initWithFormat:@"Hello, %@!", [textField stringValue]];
    NSString *message2 = [[NSString alloc] initWithFormat:@"%@ This part was added on afterwards.", message];
    const char *c = [message2 UTF8String];
    c[0] = 'b';
    NSString *output;
    output = [NSString stringWithCString:c encoding:NSASCIIStringEncoding];
    [myLabel setStringValue:output];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

}

@end

这是 .h 文件:

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *textField;
@property (weak) IBOutlet NSTextField *myLabel;

-(IBAction)changeLabel:(id)sender;
@property (weak) IBOutlet NSTextField *changeButtonText;

@end

我假设 .h 文件不相关,但我认为它会包含它。

【问题讨论】:

    标签: objective-c cocoa readonly arrays


    【解决方案1】:

    NSString不可变 字符串的容器。取自official reference

    NSString 类为管理不可变字符串的对象声明编程接口。不可变字符串是在创建时定义的文本字符串,随后无法更改

    基本上,只使用可可,您可以通过替换现有字符串中的字符来生成新的NSStrings,例如:

    - (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement
    

    但您不能修改同一个对象。正是因为这个原因,UTF8String 返回一个const char*,它是一个指向字符序列的不可变指针。这就是您收到错误的原因。

    您可以使用提供的 NSString 方法生成新字符串或将const char* C 字符串复制到char*(通过例如strdup)。

    【讨论】:

      【解决方案2】:

      c 是const char* -> 它的初始化值是它在整个运行时的值。也许您应该删除 const 关键字。

      【讨论】:

      • UTF8String 消息返回const char*。放弃预选赛似乎不是一个好主意。
      • 非常感谢,成功了。我收到警告,但它仍然有效。
      • @user2423270 - 它可能有效,但正如杰克所说,这不是一个好主意 - 你已经获得了一个指向你不应该改变的内存的指针,我们应该说,改变它是,不明智.
      【解决方案3】:

      在 Objective-C 中,NSString 实例是不可修改的,对于可修改的字符串,您需要 NSMutableString。或者,您可以从旧字符串创建新字符串。不幸的是,NSMutableString/NSString 没有 characterAtIndex: 的倒数,要更改单个字符,您需要使用 stringByReplaceCharactersInRange:withString:/replaceCharactersInRange:withString: 在其中提供要更改的字符的范围 - 位置和长度。以下是您重写的部分代码以使用这些代码,首先创建一个 new 字符串:

      NSString *message2 = [[NSString alloc] initWithFormat:@"%@ This part was added on afterwards.", message];
      NSString *output = [message2 stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:@"b"];
      

      第一个选项创建一个 new 字符串。使用 modifiable 字符串:

      NSMutableString *message2 = [[NSMutableString alloc] initWithFormat:@"%@ This part was added on afterwards.", message];
      [message2 replaceCharactersInRange:NSMakeRange(0,1) 
      

      第二个选项更改message2引用的字符串。

      您是创建新字符串还是使用可修改字符串取决于您需要进行多少更改以及是否需要保留原始字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        相关资源
        最近更新 更多