我将数据保存到核心数据时收到此消息.
NSScanner: nil string argument
Run Code Online (Sandbox Code Playgroud)
我没有使用任何NSScanner方法.它从哪里来的?
这是一个错误吗?我该怎么办?
谢谢你的帮助.
我正在开发一个旅行应用程序,我必须阅读包含所有州和国家的txt文件,因为您可以注意到这是一个非常大的文件,无论如何,这是文件内部文本的示例:
Zakinthos(ZTH),希腊
Zanesville(ZZV),美国
Zanjan(JWN),IRAN
Zanzibar(ZNZ),TANZANIA
......
现在我正在阅读文件没有问题,但我不知道如何创建两个数组,一个与州,另一个与国家,所以我可以在文本自动完成时将它们显示在表中.
我已经尝试使用NSScanner使用","作为分隔符,但我不知道如何使其工作,我也尝试使用NSString方法没有结果.
欢迎任何帮助,谢谢你提前!!!
顺便说一下我的英语XD
我刚读苹果的实况 NSScanner的.我正在尝试获取该字符串的整数:@"用户记录(3次尝试)".
我找不到任何例子,如何在括号内扫描.有任何想法吗?
这是代码:
NSString *logString = @"user logged (3 attempts)";
NSScanner *aScanner = [NSScanner scannerWithString:logString];
[aScanner scanInteger:anInteger];
NSLog(@"Attempts: %i", anInteger);
Run Code Online (Sandbox Code Playgroud) 我试图用一个空格替换某些文本中的所有多个空格.这应该是一个非常简单的任务,但由于某种原因,它返回的结果与预期不同.我已经阅读了NSScanner上的文档,看起来它运行不正常!
NSScanner *scanner = [[NSScanner alloc] initWithString:@"This is a test of NSScanner !"];
NSMutableString *result = [[NSMutableString alloc] init];
NSString *temp;
NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];
while (![scanner isAtEnd]) {
// Scan upto and stop before any whitespace
[scanner scanUpToCharactersFromSet:whitespace intoString:&temp];
// Add all non whotespace characters to string
[result appendString:temp];
// Scan past all whitespace and replace with a single space
if ([scanner scanCharactersFromSet:whitespace intoString:NULL]) {
[result appendString:@" "];
}
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,结果@"ThisisatestofNSScanner!"
不是@"This is a test of …
我想知道为什么这样做(注意我使用的是NSString类型):
let stringToSearch:NSString = "I want to make a cake and then prepare coffee"
let searchTerm:NSString = "cake"
let scanner = NSScanner(string: stringToSearch)
var result:NSString? = nil
scanner.scanUpToString(searchTerm, intoString:&result)
println(result) // correctly outputs "I want to make a"
Run Code Online (Sandbox Code Playgroud)
但如果我尝试使用"String"类型而不是"NSString",则无法编译:
let altStringToSearch:String = "I want to make a cake and then prepare coffee"
let altSearchTerm:String = "cake"
let altScanner = NSScanner(string: altStringToSearch)
var altResult:String? = nil
altScanner.scanUpToString(altSearchTerm, intoString:&altResult)
println(result)
Run Code Online (Sandbox Code Playgroud)
错误说"无法转换表达式的类型'BOOL'来输入'inout String?' 在scanUpToString行上.我不确定它甚至指的是什么BOOL.
那么,NSScanner不能与Swift String类型一起使用吗?是否有我应该使用的新命令?
我需要以"txf"格式解析数据文件.这些文件可能包含1000多个条目.由于格式定义如JSON,我想创建一个像JSON这样的通用解析器,它可以序列化和反序列化txf文件.
与JSON相反,标记没有办法识别对象或数组.如果出现具有相同标记的条目,我们需要将其视为数组.
#
标记对象的开头. $
标记对象的成员/
标记对象的结尾以下是示例"txf"文件
#Employees
$LastUpdated=2015-02-01 14:01:00
#Employee
$Id=1
$Name=Employee 01
#Departments
$LastUpdated=2015-02-01 14:01:00
#Department
$Id=1
$Name=Department Name
/Department
/Departments
/Employee
#Employee
/Employee
/Employees
Run Code Online (Sandbox Code Playgroud)
我能够使用NSScanner 创建一个通用的TXF Parser.但随着更多的条目,性能需要更多的调整.
我写了基础对象plist
,并将其性能再次与我编写的解析器进行了比较.我的解析器比plist
解析器慢大约10倍.
虽然plist
文件大小是5倍以上txf
并且有更多标记字符,但我觉得有很多优化空间.
我们非常感谢在这方面提供任何帮助.
编辑:包括解析代码
static NSString *const kArray = @"TXFArray";
static NSString *const kBodyText = @"TXFText";
@interface TXFParser ()
/*Temporary variable to hold values of an object*/
@property (nonatomic, strong) NSMutableDictionary *dict;
/*An array to hold the hierarchial …
Run Code Online (Sandbox Code Playgroud) 我使用以下代码从inputString
使用中提取数字NSScanner
NSString *inputString = @"Dhoni7 notout at183*runs in 145andhehit15four's and10sixers100";
NSString *numberString;
NSArray *elements = [inputString componentsSeparatedByString:@" "];
for (int i=0; i<[elements count];i++)
{
NSScanner *scanner = [NSScanner scannerWithString:[elements objectAtIndex:i]];
NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"1234567890"];
// Throw away characters before the first number.
[scanner scanUpToCharactersFromSet:numbers intoString:NULL];
// Collect numbers.
[scanner scanCharactersFromSet:numbers intoString:&numberString];
// Result.
int number = [numberString integerValue];
if (number != 0)
{
NSLog(@"%d\n",number);
numberString = nil;
}
}
Run Code Online (Sandbox Code Playgroud)
我的预期产量是7 183 145 15 10 100
但我得到的输出是7 …
我有一个带有格式标签的字符串,例如There are {adults} adults, and {children} children
.我有一个字典,其中"成人"和"孩子"作为键,我需要查找值并用该值替换宏.这是完全动态的; 键可以是任何东西(所以我不能硬编码stringByReplacingString
).
在过去,我只是通过循环遍历可变字符串并搜索字符来完成类似的事情; 在我去的时候从源字符串中删除我已经搜索过的内容.看起来这正是NSScanner的设计类型,所以我尝试了这个:
NSScanner *scanner = [NSScanner scannerWithString:format];
NSString *foundString;
scanner.charactersToBeSkipped = nil;
NSMutableString *formatedResponse = [NSMutableString string];
while ([scanner scanUpToString:@"{" intoString:&foundString]) {
[formatedResponse appendString:[foundString stringByReplacingOccurrencesOfString:@"{" withString:@""]]; //Formatted string contains everything up to the {
[scanner scanUpToString:@"}" intoString:&foundString];
NSString *key = [foundString stringByReplacingOccurrencesOfString:@"}" withString:@""];
[formatedResponse appendString:[data objectForKey:key]];
}
NSRange range = [format rangeOfString:@"}" options:NSBackwardsSearch];
if (range.location != NSNotFound) {
[formatedResponse appendString:[format substringFromIndex:range.location + 1]];
}
Run Code Online (Sandbox Code Playgroud)
这个问题是,当我的字符串以"{"开头时,扫描仪返回NO,而不是YES.(这是文档所说的应该发生的事情).我是否滥用NSScanner?事实上,scanUpToString
不包括作为其输出的一部分被搜索的字符串似乎使它几乎无用......
这可以轻松更改为我想要的,或者我是否需要使用可变字符串重写并手动搜索字符?
有人可以告诉我如何使用NSScanner解析一个ics文件?(Iphone App)
例如:如果.ics文件位于此URL http://www.ibz.com/data/12345.ics(不是真正的URL !!!)
我如何首先将.ics文件保存到我的iPhone应用程序中
然后我将如何使用NSScanner解析.ics文件?
请提供代码示例..
显然CGFloat
是double
在arm64上:
#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif
Run Code Online (Sandbox Code Playgroud)
所以代码
NSScanner *scanner = [NSScanner scannerWithString:string];
CGFloat c[components];
[scanner scanFloat:&c[i]]
Run Code Online (Sandbox Code Playgroud)
这对于32位应用程序来说效果很好,但是对于64位应用程序来说是破碎的.它可以替换为
NSScanner *scanner = [NSScanner scannerWithString:string];
CGFloat c[components];
#if CGFLOAT_IS_DOUBLE
[scanner scanDouble:&c[i]];
#else
[scanner scanFloat:&c[i]];
#endif
Run Code Online (Sandbox Code Playgroud)
但是有更好的选择吗?