Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么要创建“隐式解包选项”,因为这意味着您知道有一个值?

为什么要创建“隐式解包选项”,因为这意味着您知道有一个值?
EN

Stack Overflow用户
提问于 2014-06-02 20:09:33
回答 10查看 66.3K关注 0票数 511

为什么要创建一个“隐式非包装可选”而不是只创建一个常规变量或常量?如果您知道可以成功地打开它,那么为什么首先创建一个可选选项呢?例如,为什么:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let someString: String! = "this is the string"

比以下更有用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let someString: String = "this is the string"

如果“选项表示一个常量或变量被允许具有‘无值’,但”有时从程序的结构中可以清楚地看到,在第一次设置该值之后,可选选项总是有一个值“,那么从一开始将其作为可选值有什么意义呢?如果你知道一个可选的东西总是有一个值,那不是说它不是可选的吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2014-06-02 20:15:58

考虑一个对象的情况,它在构造和配置对象时可能具有零属性,但在构造和配置过程中是不可变的和非零的(NSImage通常是这样处理的,尽管在它的情况下,有时变异仍然是有用的)。隐式拆解选项将很好地清理其代码,安全损失相对较低(只要有一个保证,它就安全了)。

(编辑)但要清楚:常规的选项几乎总是更好。

票数 132
EN

Stack Overflow用户

发布于 2014-07-04 21:03:03

在我描述隐式展开选项的用例之前,您应该已经了解了Swift中的选项和隐式未包装选项。如果没有,我建议您先读我关于选拔赛的文章

何时使用隐式未包装的可选选项

有两个主要原因,一个是创建隐式解包装的可选选项。所有这些都与定义一个在nil时永远不会被访问的变量有关,因为否则,Swift编译器将总是强制您显式地打开一个可选的包。

1.在初始化过程中不能定义的常量

每个成员常量必须在初始化完成之前具有一个值。有时,在初始化期间不能用其正确的值初始化一个常量,但仍然可以保证它在被访问之前具有一个值。

使用可选变量可以解决这个问题,因为一个可选变量是用nil自动初始化的,它最终包含的值仍然是不可变的。但是,不断地展开变量可能会带来痛苦,因为您知道这个变量肯定不是零。隐式解包选项实现了与可选选项相同的好处,增加的好处是不必在任何地方显式地展开它。

这方面的一个很好的例子是,在加载视图之前,不能在UIView子类中初始化成员变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyView: UIView {
    @IBOutlet var button: UIButton!
    var buttonOriginalWidth: CGFloat!

    override func awakeFromNib() {
        self.buttonOriginalWidth = self.button.frame.size.width
    }
}

在这里,在视图加载之前不能计算按钮的原始宽度,但您知道在视图上的任何其他方法(初始化除外)之前都会调用awakeFromNib。与其强制在类中无意义地显式地展开值,还可以将其声明为隐式未包装的可选选项。

2.当应用程序无法从nil变量中恢复时

这应该是非常罕见的,但是如果当访问变量是nil时,您的应用程序就不能继续运行,那么费时费力地测试nil将是浪费时间。通常情况下,如果您的应用程序要继续运行,必须有一个绝对正确的条件,您可以使用assert。隐式未包装的可选选项中包含了一个assert。即使如此,如果选项为0,那么打开可选的包并使用更具描述性的断言通常是好的。

当不使用隐式未包装的可选选项时

1.计算迟缓的成员变量

有时,您的成员变量不应为零,但在初始化期间不能将其设置为正确的值。一种解决方案是使用隐式未包装的可选选项,但更好的方法是使用惰性变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FileSystemItem {
}

class Directory : FileSystemItem {
    lazy var contents : [FileSystemItem] = {
        var loadedContents = [FileSystemItem]()
        // load contents and append to loadedContents
        return loadedContents
    }()
}

现在,成员变量contents直到第一次被访问时才被初始化。这使类在计算初始值之前有机会进入正确的状态。

注:,从上面看,这可能与#1相矛盾。然而,有一个重要的区别有待作出。必须在buttonOriginalWidth期间设置上述viewDidLoad,以防止任何人在访问属性之前更改按钮宽度。

2.其他地方

在大多数情况下,应该避免隐式未包装选项,因为如果使用错误,当nil访问时,整个应用程序都会崩溃。如果您不确定变量是否可以为零,请始终默认使用普通可选选项。打开一个从来不是nil的变量,肯定不会有太大的伤害。

票数 464
EN

Stack Overflow用户

发布于 2014-06-03 14:44:37

隐式展开选项对于将属性表示为非可选属性非常有用,而实际上,属性在封面下需要是可选的。这往往是必要的“打结”之间的两个相关的对象,每一个需要参考另一个。当引用实际上都不是可选的时,这是有意义的,但是在初始化对时,其中之一需要为零。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// These classes are buddies that never go anywhere without each other
class B {
    var name : String
    weak var myBuddyA : A!
    init(name : String) {
        self.name = name
    }
}

class A {
    var name : String
    var myBuddyB : B
    init(name : String) {
        self.name = name
        myBuddyB = B(name:"\(name)'s buddy B")
        myBuddyB.myBuddyA = self
    }
}

var a = A(name:"Big A")
println(a.myBuddyB.name)   // prints "Big A's buddy B"

任何B实例都应该有一个有效的myBuddyA引用,所以我们不想让用户将它作为可选的,但是我们需要它是可选的,这样我们就可以在要引用的A之前构造一个B

不过!这种相互参照的要求往往是紧密耦合和不良设计的标志。如果您发现自己依赖于隐式展开选项,您可能应该考虑重构以消除交叉依赖关系。

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24006975

复制
相关文章
使用 asp.net mvc和 jQuery UI 控件包
如果你使用asp.net mvc,而且使用的js库是jQuery, 那么一定别错过使用jQuery UI,使用jQuery UI 有个一套的mvc套件值得使用jQuery ASP.Net MVC Co
张善友
2018/01/19
1.6K0
使用 asp.net mvc和 jQuery UI 控件包
在asp.net mvc上应用新ASP.NET图表控件
微软去年11月发布了一个很酷的新ASP.NET服务器控件,<asp:chart />,可以免费用在ASP.NET 3.5中,而且还可以用在asp.net mvc。可以看新ASP.NET图表控件<asp:chart runat="server"/>。 相关资源的下载链接: Download the free Microsoft Chart Controls Download the VS 2008 Tool Support for the Chart Controls Download the Microso
张善友
2018/01/30
2.8K0
在asp.net mvc上应用新ASP.NET图表控件
MVC Grid 控件
特点: 集成Grid展示,排序,删除,分页,筛选,ajax 效果: 排序,分页,查询集成ajax 使用简单: 根据编写的T4模版,能直接生成数据访问类和controller类,不必为数据访问而伤神 对
JadePeng
2018/03/12
8770
MVC Grid 控件
ASP.NET MVC 4 - 测试驱动 ASP.NET MVC
测试驱动 ASP.NET MVC Keith Burnell 下载代码示例 模型-视图-控制器 (MVC) 模式的核心是将 UI 功能划分成三个组成部分。模型表示您的领域的数据和行为。视图管理模型的显示并且处理与用户的交互。控制器协调视图和模型之间的交互。通过这样将本质上就难于测试的 UI 逻辑与业务逻辑分离开来,使得使用 MVC 模式实现的应用程序非常易于测试。在本文中,我将论述用于增强您的 ASP.NET MVC 应用程序的可测试性的最佳做法和技术,包括如何建立您的解决方案的结构、设计代码架构以便处理依
张善友
2018/01/22
5.4K0
ASP.NET MVC 4 - 测试驱动 ASP.NET MVC
Asp.Net MVC4入门指南(10):第三方控件Studio for ASP.NET MVC4 工具应用
ComponentOne Studio for ASP.NET最新版本2013V1支持MVC4,其中包括: 新增 MVC 4 工程模板 (C# & VB) 开箱即用的MVC 4 工程模板基于Microsoft内置模板创建,我们仅优化了标记和CSS样式为默认风格,熟悉的模板布局和界面风格,无疑将缩短您的学习过程、节省开发时间及提高开发效率。 新增国际化主题(Metro) MVC4 模板自动增强MVC Scaffolding模板,将会为您应用程序中的增删改查(CRUD)操作生成默认的模板文件,这些生成的文件为
葡萄城控件
2018/01/10
1.6K0
Asp.Net MVC4入门指南(10):第三方控件Studio for ASP.NET  MVC4 工具应用
ASP.NET MVC Section
本篇文章我们来讨论一下ASP.NET MVC框架中的Section。 Section主要用于将一部分代码插入到 Layout页面中的指定位置。通俗地说就是,我们先在 Layout页面中通过@RenderSection("Header")的方式挖一个坑,告诉下面的视图页面说,我这个地方有个坑,你们把你们各自相关的代码放进来吧。然后,使用该Layout的视图页面通过如下的方式将一坨坨的代码送到Layout的坑中。
全栈程序员站长
2022/09/15
7590
ServiceStack.Host.MVC vs ASP.NET MVC
ServiceStack.Host.MVC vs ASP.NET MVC解决方案解决方案子项ServiceStack.Host.MVC(3.9.71)ASP.NET MVC(3.0)路由 路由规则1.只能配置/home/{name}/{page}形式 2.不能对匹配区域({name})指定任何形式的通配符(正则,等等)1.可配置各种形式的规则,比如:home/{name}_{page} 2.可以对匹配区域({name})指定正则匹配路由匹配url->路由表->RequestDTO->根据request.me
KenTalk
2018/09/11
8970
ASP.NET MVC升级到ASP.NET Core MVC踩坑小结
ASP.NET Core是微软新推出的支持跨平台、高性能、开源的开发框架,它的优势不必多说,因为已经说得太多了。当然,现在依然有着数量庞大的系统运行于.NET Framework上,由于有大量的Break Changes,很多项目项目团队也不敢贸然升级,其中的考量也不全部是技术原因,更多的可能还是业务推进因素。
AI.NET 极客圈
2020/05/18
2.4K0
ASP.NET画图控件 Chart Control 免费控件
.NET3.5中中推出了图表控件,可以同时支持Web和WinForm两种方式,由于平时很少使用,一直没有玩玩,闲来无事,简单研究了下,感觉功能真的很强大,基本上可以满足各种图表的应用,感觉这么好用的东西才研究,真是有些落伍啊,哈哈,想必很多人已经早已玩过,这里帮大家复习下,高手绕过。
Java架构师必看
2021/03/22
4.1K0
ASP.NET画图控件 Chart Control 免费控件
ASP.NET MVC HtmlHelper类
ASP.NET MVC之 HtmlHelper 在ASP.NET MVC项目的开发中,一般会默认使用Razor视图来进行View层的编写,从而实现高效率的C#/HTML代码的混写。 示例 诸如下述代码
李郑
2018/03/01
1.8K0
ASP.NET MVC HtmlHelper类
ASP.NET Core MVC 概述
ASP.NET Core MVC 是使用“模型-视图-控制器”设计模式构建 Web 应用和 API 的丰富框架。 什么是 MVC 模式? 模型-视图-控制器 (MVC) 体系结构模式将应用程序分成 3
程序你好
2018/07/20
6.4K0
ASP.NET MVC使用javascript
@if (IsSectionDefined(“SubMenu”)) { @RenderSection(“SubMenu”, required: false) }
全栈程序员站长
2022/09/15
8400
ASP.NET MVC Action Filters
在看这篇Fun with Http Headers in ASP.NET MVC Action Filters的时候,提到了 Roni Schuetz在codeplex上创建的一个项目ASP.NET MVC Action Filters。计划在5月10日推出第一个版本。 项目计划包含的Action Filter: Action filter for creating easy REST API with JSON and XML Action filter for logging scenarios
张善友
2018/01/22
8530
ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers
序言 ASP.NET MVC允许开发者创建自定义的HTML Helpers,不管是使用静态方法还是扩展方法。一个HTML Helper本质上其实是输出一段HTML字符串。 HTML Helpers能让我们在多个页面上公用同一段HTML标记,这样不仅提高了稳定性也便于开发者去维护。当然对于这些可重用的代码,开发者也方便对他们进行单元测试。所以,创建ASP.NET MVC Bootstrap Helpers是及其有必要的。 内置的HTML Helpers ASP.NET MVC内置了若干标准HTML Hel
用户1161731
2018/01/11
1.5K0
ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers
ASP.NET MVC 路由详解
事隔多年,其实也就一年啦,重新整理下ASP.NET MVC的相关知识。继续前面的内容,来说说路由。
李郑
2019/12/04
1.5K0
asp.net MVC 验证注解
对于Web系统,对于用户的输入验证是必须的。不仅需要在客户端对用户的输入进行验证,在服务端也需要对用户的执行进行验证。 asp.net MVC中对于验证提供了一种注解机制。注解是一种通用机制,可以用来向框架注入元数据,同时框架不只驱动元数据的验证,还可以生产显示和编辑模型的HTML标记时使用元数据。 1.Required Required 是MVC提供的一种注解。当属性中一个是null或空时,Required特性将会引发一个验证错误。 [Required(ErrorMessage="")] 2.String
水击三千
2018/02/27
1.9K0
How ASP.NET MVC Works?
一、ASP.NET + MVC IIS与ASP.NET管道 MVC、MVP以及Model2[上篇] MVC、MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二、URL 路由 ASP.NET的路由系统:URL与物理文件的分离
蒋金楠
2018/01/15
1.5K0
ASP.NET MVC 行为详解
前面分别介绍了MVC中的三个重要部分,而行为,则是其中C-Controller中的重要内容,下面详解一二。 一般继承自Controller类,类Controller继承自ControllerBase,
李郑
2018/02/28
6780
ASP.NET MVC 行为详解
七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
通过第一天的学习之后,我们相信您已经对MVC有一些基本了解。 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容。本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV
葡萄城控件
2018/01/10
2.3K0
七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
ASP.NET MVC 5 - 开始MVC5之旅
本教程将使用Visual Studio 2013手把手教你构建一个入门的ASP.NET MVC5 Web应用程序。本教程配套的C#源码工程可通过如下网址下载:C#版本源码链接。同时,请查阅 Building the Chapter Downloads 来完成编译源码和配置数据库。 在本教程中的源码工程,您可在Visual Studio中运行MVC 5应用程序。您也可以使Web应用程序部署到一个托管服务提供商上。微软提供免费的网络托管多达10个网站,free Windows Azure trial accou
葡萄城控件
2018/01/10
2.2K0
ASP.NET MVC 5 - 开始MVC5之旅

相似问题

ASP.NET MVC控件

20

ASP.NET MVC控件

30

ASP.NET MVC部分控件

30

ASP.NET MVC +图表控件

11

Asp.net Mvc内置控件

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文