热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Swift初始化返回nil

在Objective-C中,init方法除了返回self以外,其实和一个普通的实例方法并没有太大的区别。如果你喜欢的话,甚至可以多次进行调

Objective-C中,init 方法除了返回 self 以外,其实和一个普通的实例方法没有太大的区别。如果你喜欢的话,甚至可以多次进行调用,这都没有限制。一般来说,我们还会在初始化失败(比如输入不满足要求无法正确的初始化)的时候返回nil 来通知调用者这次初始化没有正确完成

但是,在Swift中默认情况初始化方法不能return语句来返回值的,也就是说我们没有机会初始化一个Optional的值。一个很典型的例子就是初始化一个 url。在Objective-C中。如果我们使用一个错误的字符串来初始化一个NSURL 对象,返回会是nil,代表初始化失败。所以下面这种“防止百度吞链接”式的字符串(注意两个t之间的空格和中文式句号),也是可以正常编译和运行的,只是结果是个nil

NSURL *url = [NSURL URLWithString:@"ht tp://swifter。tips"];
NSLog(@"%@", url); // nil

-initWithString: 在Swift中对应的是一个convenience init方法:public convenience init?(string URLString: String)。上面的Objective-C代码在Swift中等效为:

let url1 = NSURL.init(string: "ht tp://swifter。tips")
let url2 = URL.init(string: "ht tp://swifter。tips")
print(url1) // nil
print(url2) // nil

虽然在默认情况下不能init 中返回nil,但是我们可以在init声明时在其后上一个 ? 或者! 来表示初始化失败时可能返回nil。比如为Int添加一个extension来让其可以接收字符串,并通过字符串初始化对应的数字时,就可能遇到初始化失败的情况,Int本身有@inlinable public init?(_ description: String)初始化方法,我们只是做个实验:

extension Int {init?(fromString: String) {let i: Int? = (fromString as NSString).integerValueif fromString.count > 0 && i ?? 0 > 0 {self = i!} else {return nil}}
}

let number = Int.init(fromString: "12")
let number2 = Int.init(fromString: "十二")
print(number)
print(number2)

numbernumber2都将是Int? 类型,通过Optional Binding,我们就能知道初始化是否成功,并安全的使用它们了。我们在这类初始化方法中还可以对self进行赋值,也算是init 方法里的特权之一。


推荐阅读
  • rust编程这篇文章是关于我通过解决Twitch上尚未解决的所有CtCI问题来学习Rust的经验。英国科学博物馆集团AdaLovelace的肖像Rust徽标,由Moz ... [详细]
  • iOS安全攻防(二十四):敏感逻辑的保护方案(1)Objective-C代码容易被hook,暴露信息太赤裸裸,为了安全,改用C来写吧!当然不是全部代码都要C来写,我指的是敏感业务逻 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • jsappsugar,基于,js,语法,定义 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • TIOBE 2012年2月编程语言排行榜:C#力压C++
    TIOBE2012年2月编程语言排行榜已经发布,本月C#挤进前三,占领季军位置,C降至第四名。VisualBasic惨遭冷谈, ... [详细]
  • 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值。Swift中的闭包与C和Objective-C中的代码块(blocks)以及其他一些编程语言中的 ... [详细]
  • .net是什么语言_2019年3月编程语言排行榜:C语言、Python、C++都在增长
    程序猿(ID:imkuqin)编译原文:https:www.tiobe.comtiobe-indexTIOBE公布了2019年3月编程语言排行榜 ... [详细]
  • 客户端我有一个使用基本POST或GET方法连接到远程服务器的java应用程序:URLurlnewURL(urlStr);HttpURLConnectionconn(HttpURLC ... [详细]
  • ObjectiveC与Swift之间的互相调用和跳转
    Objective-C与Swift之间的互相调用和跳转-一、OC和Swift互相跳转首先在需要引入Swift的文件中导入头文件#import工程名-Swift.hOC跳转Swift ... [详细]
author-avatar
心若在梦就在_2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有