Tag: null

开始Swift编程第3部分-运算符,可选和Nil值

在上一篇文章中,我们介绍了值类型,引用类型并以集合类型结束。 Swift编程入门第2部分—值类型,引用类型,指针和集合类型 之前,我们讨论过变量,常量和类型。 medium.com 今天,我们仍将继续介绍基础知识,但是好消息是在今天之后,您将能够编写一个解决您的数学问题的程序,无论是幼儿园的数学课程,还是使用公式进行的高级财务计算。 初步资料 您应该了解操作顺序(PEMDAS)的概念 如果数学课对您来说太早了,请按以下步骤操作: 括号(从内到外) 从左到右的指数 从左到右的乘法 从左到右划分 从左到右加法 从左到右的减法 而已! 经营者 只要达到三年级,您就已经在编程中看到了大多数操作员。 让我们看看您已经知道的那些。 加,减,乘和除的一种简便方法是将运算符追加到赋值运算符(您仍然可以使用加法运算符使用此方法来连接字符串)。 可选值和零值 好的,我将尝试使其变得容易,但可能会伤到您的大脑。 很好,这意味着您将学习。 当我谈到变量实例化和声明时,我希望您回想一下本系列的第一部分。 我有点掩饰了声明,而是给了您一些实例化新变量的例子。 我很抱歉,这只是为了让您免于一切,直到您准备好为止。 我们可以像这样声明变量

可空性注释:Objective-C现代化(第1部分)

对于iOS开发人员而言,Objective-C现代化确实非常重要。 它提供了更好的类型安全性,并改善了与Swift代码库的交互。 有关更多信息,请查看我的第一篇文章:了解Objective-C现代化。 首先,我们将讨论可空性注释,它们为何重要以及它如何工作。 背景 与Java等运行时错误语言不同,Swift和Objective-C都具有编译时错误的优势。 即使这些错误有时会令人讨厌,但编译时错误通过帮助我们追踪那些绝对会导致应用程序在运行时崩溃的愚蠢错误,为我们提供了巨大的优势。 尽管Objective-C出现编译时错误,但在涉及类型安全之类的某些问题时,它往往比Swift更宽松。 一个这样的示例就是它如何处理缺少值的问题: null (对于ObjC指针引用,为nil )。 在Objective-C中,您可以使用nil指针做一些事情,因为Objective-C将nil视为0 。 如果将消息发送到nil指针,则会返回nil (或其他类似的“falsy”值)。 在Swift中, nil在功能上等效于其他语言,例如C ++中的null 。 如果您尝试在nil上调用函数,则会得到如下异常: 致命错误:展开一个可选值时意外发现nil 因此,确定您的价值是否可以为零非常重要。 Swift中现有的Objective-C API Swift通过可选(可以为nil )和非可选(不能为nil )来实现这一点。 但是,直到几年前,Objective-C还无法表达这一概念。 因此,您的Objective-C代码: @property(非原子,副本,只读)NSString * email;-(BOOL)setUserEmail:(NSString *)email密码:(NSString *)password; -(BOOL)setUserImage:(UIImage *)图像; 将会翻译成Swift这样的东西: var email:字符串{get} func setUserEmail(_ email:字符串!,密码:字符串!) 函数setUserImage(_ image:UIImage!) 如果没有文档,此代码会造成混乱,因为所有这些函数都将nil作为有效的参数值,但尚不清楚nil是否应被接受。 另外,如果我们在Objective-C代码中传递nil,则不会出现Objective-C编译错误。 这可能不会导致崩溃,但是肯定是模棱两可的。 歧义很少是好的。 大规模的歧义是危险的。 随着Swift开始起飞,苹果公司开始使用自己的一些框架启用适当的Swift可选翻译.2015年3月,苹果发布了一篇有关Nullability和Objective-C的文章,向我们展示了我们如何也可以启用这种适当的翻译。 基本 核心是2个关键字: _Nullable和_Nonnull 。 […]

UIImage返回零

我将创build一个UIImage但如果我debugging该方法返回nil 。 我希望有人知道我必须做什么。 我的代码: 返回nil: UIImage *image1 = imgView.image; 整个代码块: UIImage *image1 = imgView.image; NSString *cachedFolderPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; NSString *cachedImagePath = [cachedFolderPath stringByAppendingPathComponent:@"image1.png"]; [UIImagePNGRepresentation(image1) writeToFile:cachedImagePath atomically:YES]; 更新: – (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) { toolbar.hidden = NO; UIImage *image1 = imgView.image; NSString *cachedFolderPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; NSString *cachedImagePath = […]

获取UITableViewCellAccessoryDe​​tailButton的框架(这是零)

我试图从UITableViewCell的accessoryView展示一个popover。 该视图是默认的UITableViewCellAccessoryDetailButton 。 显然accessoryView是nil ,根据这个问题 ,这是一个预期的行为。 我的问题是,即使accessoryView属性为零,我如何获得附件的框架?

iOS:NSString丢失URL,(空)显示

这是我的代码到目前为止: NSString *listedImageURL = listedProduct.image; NSLog(@"URL: %@", listedImageURL); 此代码工作正常,NSLog显示我正确的URL。 但是当我尝试下面的代码,NSLog显示(空): NSString *listedImageURL = listedProduct.image; NSURL *imageURL = [NSURL URLWithString:listedImageURL]; NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; UIImage *image = [UIImage imageWithData:imageData]; 我究竟做错了什么??

指向零的一些IBOutlets

经过很长一段时间,我终于开始使用Objective-C,到目前为止我唯一完整的应用程序。 目标是最终重构ARC和可能的故事板,但是目前我正在抛光iOS 4.x目标。 我很生锈,所以如果这是一个愚蠢的问题,请和我联系。 我有一个button,在我的主视图触发showAction方法。 方法如下: – (void)showAbout { AboutViewController *aboutView = [[[AboutViewController alloc] init] autorelease]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { aboutView.modalPresentationStyle = UIModalPresentationFormSheet; } else { aboutView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; } [self presentModalViewController:aboutView animated:YES]; } AboutViewController类有这个.h: @interface AboutViewController : UIViewController <UIActionSheetDelegate, MFMailComposeViewControllerDelegate> { } – (IBAction)dismiss:(UIButton *)sender; – (IBAction)feedback:(UIButton *)sender; @property (retain) IBOutlet UIButton *dismissButton; […]

如何识别出现为空括号的空NSData对象?

我正在处理Game Kit的GKTurnBasedMatch类中的腐败问题(请参阅此线程 ),有时会导致游戏状态无效,并且matchData损坏。 所以作为一个解决方法,我正在创build一个方法来识别这些无效匹配,所以我可以适当地处理它们。 损坏的matchData似乎是一个很好的方法来做到这一点。 但是,到目前为止,我一直无法识别他们。 当我这样做: // "match" is an existing GKTurnBasedMatch object NSLog(@"match data is: %@",[match matchData]); NSLog(@"match data is nil? %@",[match matchData] == nil ? @"YES" : @"NO"); NSLog(@"match data equals empty nsdata? %@",[match matchData] == [NSData data] ? @"YES" : @"NO"); 我得到以下内容: match data is: <> match data is nil? NO […]

tableView:cellForRowAtIndexPath删除项目后用nil indexPath调用

我有一个UITableViewpipe理的相当香草的UITableView来显示给定的核心数据实体的所有实例。 当用户通过滑动删除表视图中的一个条目时, tableView:cellForRowAtIndexPath:最终会在我的UITableViewController用一个nil indexPath 。 由于我没有预料到它将被调用一个nil indexPath ,应用程序崩溃。 我可以通过检查nil值来解决崩溃问题,然后返回一个空单元格。 这似乎有效,但我仍然担心我可能处理了错误的事情。 有任何想法吗? 有没有人见过tableView:cellForRowAtIndexPath:用nil indexPath ? 请注意,这只有当用户通过滑过单元格从表视图中删除时才会发生。 使用表格视图编辑模式删除项目时,不会发生。 删除单元格的两种方法会有什么不同? 那么,在表视图委托方法中获得一个nil indexPath真的是一个好的情况吗? 我的视图控制器代码是非常标准的。 这里是删除: – (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { // Delete the row from the data source NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; [self.moc deleteObject:managedObject]; NSError *error = NULL; Boolean success = […]

Objective-C:你可以testing静态类types的未初始化的指针吗?

我正在尝试做一些事情: 在一些物体A: UITableVIewController *viewController; [someObjectB setupView: viewController]; 在一些物体B: -(void) setupView:(UIViewController*)view { if the pointer passed in is of type UITableViewController then … say, for instance with: [[view class] isKindOfClass [UITableViewController class]] or: [view isKindOfClass [UITableViewController class]] } 但是,我有两个问题:首先,参数作为UITableView(我正在做,因为这个方法也会configuration其他types的视图控制器)的超类UIViewController进入B方法的事实。 所以我想知道,如果我将UITableViewController传递给types为UIViewController的方法参数,isKindOfClass仍然会dynamic绑定吗? 也就是说,运行时检查内容的types,而不pipe指针的静态types如何? 其次,请注意,在传递给B之前,我没有初始化对象A中的指针。实际上,我希望B初始化它。 但是后来buy的问题就变成了,我怎么testing一个未初始化的指针上的静态指针types呢? 也就是在B里面:[view isKindOfClass [UITableViewController class]]给了我一个BAD_EXEC。 我的猜测,因为我显然是试图访问一个JUL指针。 那么还有一种方法可以根据指针的静态types声明来进行testing吗? 附加:(因为我把它添加为一个评论,而不是,对不起) 让我用更具体的术语来重新说明这个问题的一部分:我想obj B创build一个UITableViewControllertypes的variables,将它传递给A,并且A意识到它被赋予了一个指向UITableViewController的指针,以便它实际上可以初始化这个指针UITableViewController的一个特定的子类,然后obj B将该对象初始化为其他对象。 我想要做到这一点的理由是以下情况:我有一个基于导航控制器的应用程序。 它有一个带有button的根控制器,根据哪个button被按下,根控制器实例化并推送表控制器用于数据库的不同表,并且当点击这些表的一行时,表实例化并推送详细的视图控制器。 到目前为止这么好,但由于项目的性质,我想保持整个navigationcontroller实例化推链不可知的事实,有一个数据库,表和详细视图控制器实际上是UITableViewController和UIViewController的具体子类, […]

NSURLConnection的initWithRequest何时返回nil

有谁知道在哪种情况下初始化一个NSURLConnection返回nil而不是创build的连接。 该文件说,这是可能的,但没有指定发生这种情况。 有问题的方法/消息: [[NSURLConnection alloc] initWithRequest:request delegate:self]; – 根据NSURLConnection类参考: 返回值:URL请求的URL连接。 如果无法初始化连接,则返回nil。 URL加载系统编程指南说: 如果NSURLConnection无法为请求创build连接,则initWithRequest:delegate:返回nil。 – 虽然这个方法有可能返回nil,但是我无法想出一个触发这个的scheme。 我已经尝试了以下情况: 具有空url的URLRequest : connection:didFailWithError:委托方法被称为“不支持的URL”,作为错误。 带有无效URL的URLRequest : connection:didFailWithError:委托方法被称为“错误的URL”。 URLRequest不存在url: connection:didFailWithError:调用委托方法“找不到指定主机名的服务器”。 作为错误。 有效的请求,但没有互联网: connection:didFailWithError:委托方法被称为“Internet连接似乎是脱机。 作为错误。 零请求:导致崩溃。 initWithRequest方法在每个场景中(除了最后一个场景)都返回了一个有效的NSURLConnection ,并且调用了connection:didFailWithError:带有一个适当的错误。 有没有人能够找出哪个场景导致零返回?