问题标签 [designated-initializer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - 在 Swift 类的指定初始化程序中调用实例方法
在 Swift 编程语言中,强制要求
“指定的初始化程序必须确保其类引入的所有属性在委托给超类初始化程序之前都已初始化。” 来自另一个 S/O 的报价来源
否则会显示类似以下的错误
属性“self.baz”未在 super.init 调用中初始化
我想在 Swift 中实现以下 Objective-C 代码:
以下实现会引发如上所述的编译器错误:
如果我执行以下操作,我会收到一条错误消息
在 super.init 初始化 self 之前在方法调用“parseString”中使用 self
所以我目前的解决方案是使用私有类方法:
我的问题是是否有更好的方法来实现相同的目标,还是私有类方法是最好的方法?
swift - SKShapeNode 的子类是否可以使用其便利初始化程序之一?
我有一个继承自 SKShapeNode 的类,因为我想添加其他属性。我遇到的问题是我希望能够通过使用 SKShapeNode 的“便利”初始化程序创建一个“圆” SKShapeNode.init(circleOfRadius:CGFloat)
,但由于它是一个便利初始化程序,编译器会抱怨一条消息“必须调用 SKShapeNode 类的指定初始化程序” ,因为它只允许调用父类的“指定初始化程序”,但 SKShapeNode 的唯一“指定”初始化程序是SKShapeNode.init()
,它不会创建我想要的圆形。下面是我的编译器错误代码。所以问题是,我可以继承 SKShapeNode 并且仍然以某种方式访问“便利” 初始化器用圆形初始化它?在我看来,这是不可能的。那么有什么解决方法吗?
谢谢
c - 有没有办法警告行为不端的指定初始化程序?
C99 为结构引入了指定初始化器的概念。例如,给定:
我可以像这样初始化:X foo = {.a = '\1', .b = 2.0F, .c = 4};
并且调用:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);
会输出:
c = 4
a = 1
b = 2.000000
正如这里提到的,这具有分配给c
then a
then的“令人惊讶的行为”,b
与我指定的初始化程序的顺序无关。
如果我有这样的功能,这将成为一个真正的问题:
我想像这样初始化:X foo = {.a = (char)f(), .b = g(), .c = h()};
现在当我这样做时:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);
我得到:
c = 4
a = 5
b = 7.000000
问题是没有警告我的初始化顺序没有得到遵守。是否有警告或我可以为此启用的东西?
[现场示例]
swift - 在不提供 NSTextContainer 的情况下初始化 NSTextView 的子类
我有一个子类NSTextView
,在这个子类的初始化程序中,我想调用:
这是我在以NSTextView
编程方式初始化时总是做的事情。我简单地写:
但是,当我在子类 ( super.init(frame: (...))
) 中执行此操作时,编译器会引发错误。它不会让我使用init(frame:)
,因为init(frame:)
它是 的便利初始化器NSTextView
,我必须调用“超类的指定初始化器”。
检查文档后,我发现指定的初始化程序NSTextView
是init(frame: textContainer:)
但我不想处理NSTextContainers
. 为什么我必须从对象的子类调用指定的初始化程序,但如果对象没有被子类化,我可以调用便利初始化程序?每当我通常初始化 an时,NSTextView
我不必提供 an NSTextContainer
,但是当我将 an 初始化NSTextView
为子类的超类时,我会提供。为什么是这样?
另外,有没有办法NSTextView
用一种“默认”文本容器初始化一个?不管指定的初始化器如何,我在这里要做的就是创建一个NSTextView
而不用担心NSTextContainers
.
c - 在堆中使用指定的初始化器
designated initializers
可以毫无问题地使用如下所示(对于“billy”),但是当在动态内存上使用相同的初始化方法时,事情将在编译时中断。
使用指定初始化器有什么限制?
除了我们正在写入的位置(即地址)之外,是什么让这两个初始化不同?为什么我们不能在动态内存中使用指定的初始化器?
c - 通过宏组合两个指定的初始化器
在一个嵌入式项目中,我使用了一个库,该库提供了一个用于初始化结构的宏。这提供了合理的默认值,但默认值取决于其他参数。我想覆盖这个指定初始化器的一个或多个值,因为之后初始化这些值会产生开销。
理想情况下,我不想复制粘贴所有宏,因为我必须管理第三方代码。如果库更改它的默认值,我也不想这样做。
有没有一种组合或覆盖指定初始化器的方法,所以没有开销?代码必须符合 C99 且可移植。
一些示例代码来演示该问题:
swift - 如何在指定的初始化程序中调用协议扩展初始化程序?
我正在尝试将协议扩展初始化程序注入现有类的指定初始化程序。我认为没有办法解决它而不覆盖类中指定的初始化程序,然后在其中调用协议扩展初始化程序。
以下是我正在尝试的,特别是在UIViewController
课堂上:
有没有办法利用协议扩展初始化程序,以便在框架现有的初始化过程中自动调用它?
c - 在 VS2013 中使用指定的初始化程序来初始化结构中的 2D 字符数组初始化程序会发出错误 C2078
我正在使用VS2013。整个程序是C,而不是C++。
我可以像这样初始化一个“字符串数组”而没有任何问题:
我有一个这样声明的结构:
当我尝试像这样初始化结构时:
我收到“错误 C2078:初始化程序太多”。这是因为数组初始化 - 如果我删除该.titles = { ...
行,错误就会消失。为什么我会收到此错误?在结构初始化程序中完成这种类型的字符串初始化是否有不同的方法?
如果我将结构的声明更改为如下所示
错误消失了。然而,这不是我能做出的改变。代码库的其他部分要求此结构的大小正好为 400 字节。
此外,我很清楚我可以strcpy
用来填写每个字段,但这并不能回答我的问题。
ios - 调用 UIView initWithFrame 即使从 NIB 加载 self ?
我继承了一个代码库,发现编译器抱怨这段代码:
XCode 抱怨未调用超类中的指定初始化程序。如果我取消注释对 super 的调用,错误就会明显消失。但是由于该应用程序并没有为相当多的 iOS 版本缺少该行而烦恼,我不确定这是否是一个学术要求,或者在这种情况下甚至可能是错误的。
使用 a 调用该loadNibNamed
方法self
,self
然后将其覆盖。这会导致无法立即看到的麻烦吗?
在这种情况下,正确的实施是什么?
swift - 必需的初始化程序和指定的初始化程序有什么区别?
我正在创建自己的自定义 tableViewCell,然后我收到一条错误消息:
“必需”初始化程序“init(coder:)”必须由“UITableViewCell”的子类提供
我查了一下,显然这也是必须实现的。但这导致我对必需初始化程序与指定初始化程序的混淆
苹果文档说:
必需的初始化程序:
在类初始值设定项的定义之前写入 required 修饰符以指示该类的每个子类都必须实现该初始值设定项:
指定初始化器
指定初始化器是类的主要初始化器。指定的初始化程序完全初始化该类引入的所有属性,并调用适当的超类初始化程序以继续沿超类链的初始化过程。
以下陈述是否正确:
- 必需的初始化程序始终是指定的初始化程序
- 每个指定的初始化器不一定是必需的初始化器
- 一个类只能有一个必需的初始化器,但是它可以有多个指定的初始化器?
话虽如此,我仍然不完全了解它们的功能差异。