- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
扩展不能包含存储的属性,但是为什么可以在扩展内定义静态存储的属性呢?
我也没有找到任何文档提及扩展中允许使用静态属性。
extension String {
static let test = "Test"
static var test2 = "Test2"
}
最佳答案
扩展不能包含存储的实例属性。为什么?因为添加实例属性将更改该类型的实例的大小。如果一个模块添加了扩展名,使得Int
现在长2个字,会发生什么情况?例如,当它从另一个仍为1个字大小的模块中获取Int
时,应该怎么办?
扩展中允许使用静态存储属性的原因仅仅是因为它们具有静态生存期。它们独立于您要扩展的给定类型的任何实例而存在。实际上,它们不过是全局存储的变量而已,只是将其命名为一种类型。因此,可以自由添加它们,而不会影响在不了解它们的情况下已经编译的代码。
但是,值得注意的是,当前定义静态存储属性存在三个限制。
1.您不能在通用类型上定义static
存储的属性
对于通用占位符的每个单独的特化,这将需要单独的属性存储。例如,使用:
struct S<T> {
static var foo: Int {
return 5
}
static let bar = "" // error: Static stored properties not supported in generic types
}
foo
是针对
S
的个别特化(例如
S<Int>.foo
和
S<Float>.foo
)而不是
S
本身调用一样(实际上,
S
目前还不是一种类型,它要求
T
满足);
bar
可能相同。例如,它将被称为
S<Int>.bar
而不是
S.bar
。
self
参数传递给接收者。这可以在静态属性初始化程序表达式中访问。因此允许他们调用其他静态方法。
static let baz = T.self
的简单情况)。因此,我们需要为每个存储空间单独存储。
import Foundation
struct S<T> {
static let date = Date()
}
date
进行新的特化处理时隐式生成了
S<T>
的新存储,则
S<Float>.date
将不等于
S<Int>.date
;这可能会造成混淆和/或不期望。
static
存储的属性
static
存储属性将为该协议(protocol)的每种符合类型都需要单独存储(但同样;没有理由,编译器/运行时不能这样做)。
static
成员不是协议(protocol)类型本身的成员。它们是符合协议(protocol)的具体类型的成员。
protocol P {}
extension P {
static var foo: Int {
return 5
}
static let bar = "" // error: Static stored properties not supported in generic types
// (not really a great diagnostic)
}
struct S : P {}
struct S1 : P {}
foo
,也不能说
P.foo
。我们只能说
S.foo
或
S1.foo
。这很重要,因为
foo
的getter可以调用
self
上的静态协议(protocol)要求;但是,如果
self
是
P.self
(即协议(protocol)类型本身),则无法实现,例如
protocols don't conform to themselves。
static
存储的属性(例如
bar
),将同样如此(可能)。
class
存储的属性
class
存储的属性支持的已计算
static
属性)。
final
,因此是
static
)。尽管如此,但扩展名当前允许使用
class
计算的属性,因此出于一致性考虑,可以允许使用它。
关于swift - 扩展名可能不包含存储的属性,但是为什么允许使用静态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45467329/
我有一个 .crt 文件。打开那个文件,我看到它以开头 -----BEGIN CERTIFICATE----- 如何从这个文件生成这 2 个文件?: 以-----BEGIN CERTIFICATE R
我有一个文件被加载到 fd.ChosenName 并想知道是否有一个快速的解决方案,例如与 stringbuilder 相反的截断文件名(扩展名)以用于显示目的。因此,如果 fd.ChosenName
我的文件名如下:name1.csv,我想提取该字符串的两个子字符串。一种将 name1 存储在一个变量中,另一种将扩展名 csv 存储在另一个变量中,但不带点。 我一直在寻找是否有像 Java 的 i
我正在尝试找出一种方法来确定我在 struts2 应用程序中上传的文件的文件类型。我的应用程序可以读取 CSV 和 XML 文件并根据上传的文件类型执行操作。我将该文件作为“File”类的实例。该文件
如何使用 NLP/信息提取 (IE) 方法检测/找出首字母缩略词的含义(扩展名)? 我们希望检测自由文本中是否使用了单词或其首字母缩略词,并将其映射到相同的实体/标记。 大多数在线论文都是关于医学缩略
我正在编写一个 shell 脚本,该脚本需要改变其行为,并根据特定 X11 扩展的存在或不存在为被调用程序提供不同的选项。我有一个可行的解决方案,但我希望有一个更干净的解决方案。我愿意考虑一个简单的
我要查找文件名的扩展名,扩展名只能是3个字符。 有点像, filename = str(input("Please enter filename: ")) 然后我想执行一个任务来查找扩展名,如果扩展名
我正在开发一种文档管理系统。最终用户是企业级用户。 我目前仅检查并允许上传符合以下条件之一的文件: "png|jpe?g|gif|xls|doc|docx|csv|ppt|txt|pdf|rtf" 我
尝试将文件列表添加到 Jlist,然后过滤 JList 中的文件以仅返回 .txt 文件和固定字符长度。还尝试删除返回的文件路径,并仅在文件 JList 中显示文件名+扩展名。 到目前为止,除了删除文
File.py file = fields.Binary('File') @api.multi def get_file(self): if self.file: xsl_fi
我尝试使用导航 Controller 使我的应用程序处于纵向模式我收到此错误 iam usring Xcode7 and Swift 2 And Target System IOS 9.3 声明仅在文
这个问题在这里已经有了答案: Test whether a glob has any matches in Bash (22 个回答) 关闭去年。 您将如何使用 bash 判断目录中是否存在特定扩展名
我正在开发转换器服务,我使用 FFMPEG 转换视频。 我想检查输入文件,哪种真的是视频。 我使用以下命令并获取文件类型。但是如果文件已经被操作过就无法理解了: curl -s -o /dev/nul
我需要一个规则来添加 .html 扩展名,只要有“不”结尾的斜杠。 一个新客户最近更改了电子商务脚本,新版本以不同的方式处理 SEO,并更改了他们所有 16,000 多个产品链接。这在站点被重新索引之
我正在尝试使用 Kickstarter 进行扩展以覆盖页面的正常呈现,并呈现 PDF 文件。为此我使用 FPDF。但我不确定该怎么做。我尝试这样做,但没有成功: AddPage();
在寻找巴恩斯利蕨分形的实现时,我遇到了一个具有 .pde 扩展名的实现。哪种编程语言使用此扩展? Implementation Page 最佳答案 此代码来自Processing.org,一个基于Ja
Visual Studio Code (1.22.2) 提供了一个名为 .dockerfile 的文件扩展名。在保存对话框中。带有此扩展名的文件是什么? Dockerfile 包含在所有文档和示例中,
我正在为32位计算机编译一个应用程序,因为该应用程序的创建者将其设置为64位。我确保所有库和DLL都是32位的。但是,我在编译时遇到问题。当我使用sh make.sh进行编译时,当它进入GCC构建部分
当我将文件保存在 img/upload 文件夹中时,文件会以正确的文件扩展名保存。 但是,当我尝试下载该文件时,会附加一个 .htm 文件扩展名。 我怎样才能避免这种情况?我在下面添加了我的代码; V
GHC 有几种有用的语言 extensions用于机械派生各种常见的 Haskell 类型类(-XDeriveFunctor、-XDeriveFoldable、-XDeriveTraversable)
我是一名优秀的程序员,十分优秀!