如何将NSString截断为设定长度?

nev*_*ing 65 string iphone cocoa objective-c

我搜索过,但令人惊讶的是找不到答案.

我有很长一段路NSString要想缩短.我希望最大长度大约为20个字符.我在某处读到了最好的解决方案substringWithRange.这是截断字符串的最佳方法吗?

NSRange stringRange = {0,20};
NSString *myString = @"This is a string, it's a very long string, it's a very long string indeed";
NSString *shortString = [myString substringWithRange:stringRange];
Run Code Online (Sandbox Code Playgroud)

它似乎有点微妙(如果字符串短于最大长度则崩溃).我也不确定它是否是Unicode安全的.有没有更好的方法呢?有没有人有这个很好的类别?

moh*_*enr 120

实际上关于"Unicode安全"的部分已经死了,因为许多字符组合在unicode中,建议的答案不考虑.

例如,如果要键入é.一种方法是键入"e"(0x65)+组合重音""(0x301).现在,如果您输入这样的"café"并截断4个字符,您将获得"cafe".这可能会在某些地方引起问题.

如果你不关心这个,其他答案也可以.否则,这样做:

// define the range you're interested in
NSRange stringRange = {0, MIN([myString length], 20)};

// adjust the range to include dependent chars
stringRange = [myString rangeOfComposedCharacterSequencesForRange:stringRange];

// Now you can create the short string
NSString *shortString = [myString substringWithRange:stringRange];
Run Code Online (Sandbox Code Playgroud)

请注意,这样您的范围可能会比初始范围长度长.在上面的咖啡馆示例中,即使您仍然有4个"字形",您的范围也将扩展到5的长度.如果您的绝对长度必须小于您指定的长度,则需要检查这一点.


Md.*_*san 15

斯威夫特 4

let trimToCharacter = 20
let shortString = String(myString.prefix(trimToCharacter))
Run Code Online (Sandbox Code Playgroud)

快乐编码。


bra*_*ipt 14

由于这个答案实际上并不在这个列表中,所以最简单,最明智的单行:

NSString *myString = @"This is a string, it's a very long string, it's a very long string indeed";
myString = (myString.length > 20) ? [myString substringToIndex:20] : myString;
Run Code Online (Sandbox Code Playgroud)


小智 11

更短的解决方案是:

NSString *shortString = ([myString length]>MINLENGTH ? [myString substringToIndex:MINLENGTH] : myString);
Run Code Online (Sandbox Code Playgroud)


Sha*_*rog 7

看起来有点微妙(如果字符串短于最大长度则崩溃)

那为什么不解决这部分呢?

NSRange stringRange = {0, MIN([myString length], 20)};
Run Code Online (Sandbox Code Playgroud)