当前位置: 首页 > 面试题库 >

自我初始化参数

墨安阳
2023-03-14
问题内容

我想像这样使用Self in init参数:

class A {
    public init(finishBlock: ((_ operation: Self) -> Void)? = nil) {...}
}

我知道我可以在这里使用“ A”,但是我想实现这一点,如果某个类从A继承,那么它的初始化器将知道操作是它的类类型,而不仅仅是A。所以例如,如果我这样写:

class B: A {
    public init(finishBlock: ((_ operation: Self) -> Void)? = nil) {...}
    public func fooOnlyInB() {}
}

然后,我可以使用:

let b = B { (operation) in
    operation.fooOnlyInB()
}

这可能吗?


问题答案:

不必使用SelfA在每个初始化器中使用,您可以简单地重写每个子类的初始化器以使用其自己的类型为operation

之所以起作用,是因为A的初始值设定项声明operation的类型应符合A,并且在您覆盖它时,您可以自由使用Aas
的子类operation。但是,如果更改operation为不相关的类型,例如StringInt,则编译器将不会覆盖现有的初始化程序

首先,定义Ainit

class A {
    init(finishBlock: ((_ operation: A) -> Void)?) {...}
}

现在要创建一个子类,您必须init改用该子类的类型operation。在对的调用中super.init,将upcast
operation$0)强制为您的子类的类型,然后finishBlock使用cast进行调用operation

class B: A {
    override init(finishBlock: ((_ operation: B) -> Void)?) {
        // Perform custom initialisation...
        super.init { finishBlock?($0 as! B) }
    }

    func fooOnlyInB() {
        print("foo")
    }
}

B的初始化器现在可以传递Boperation,这意味着你不需要自己再投吧!这是由于您可以init在这种情况下使用更具体的类型覆盖的事实B

let b = B { operation in
    operation.fooOnlyInB() // prints "foo"
}


 类似资料:
  • 上一节中我们给大家介绍了Fullpage的基本用法,可能很多用户有个性化的需求,没关系Fullpage提供了多个参数,我们可以配置这些参数,满足我们项目的需求。 controlArrows 默认值:true,决定是否使用控制箭头向左或向右移动幻灯片。 verticalCentered 默认值:true,决定是否初始化后,是否垂直居中网页的内容,如果你想自定义元素的位置,那么你可以设置为false,

  • 如下 ServletContext 接口方法允许 servlet 访问由应用开发人员在Web 应用中的部署描述符中指定的上下文初始化参数: getInitParameter getInitParameterNames 应用开发人员使用初始化参数来表达配置信息。代表性的例子是一个网络管理员的 e-mail 地址,或保存关键数据的系统名称。

  • 问题内容: 我有一个Swift类,我想看起来像这样: 但是,Swift不喜欢我要传递给初始化程序的事实。我在这里打破某些模式吗?应该如何完成这样的初始化? 问题答案: 您已经找到了Implicitly Unwrapped Optional 的主要用例。 你需要访问的,之前被初始化。 否则,应该 永远 是零,所以你不应该有外部的检查。 因此,您应该声明。

  • 本文向大家介绍Swift使用参数自定义初始化,包括了Swift使用参数自定义初始化的使用技巧和注意事项,需要的朋友参考一下 示例 请注意,您不能省略参数标签: 为了允许省略参数标签,请使用下划线_作为标签: 如果参数标签使用一个或多个属性共享名称,请使用self显式设置属性值:            

  • 问题内容: 我应该传递什么值来为N个项目创建有效的/ 基于结构的结构? 在中,有效数字为N(N已假定未来增长)。a的参数应该是什么?((int)(N * 0.75d),0.75d)?更多?减?更改负载系数有什么影响? 问题答案: 关于负载因子,我将简单引用HashMap javadoc : 通常,默认负载因子(.75)在时间和空间成本之间提供了很好的折衷。较高的值会减少空间开销,但会增加查找成本(

  • 问题内容: 和!和有什么不一样? 问题答案: 和是存储在web.xml文件中的静态参数。如果您有不经常更改的数据,则可以将其存储在其中之一中。 如果要存储限于 特定servlet范围的 特定数据,则可以使用。内部声明的任何内容仅对该 特定servlet 才可访问 。init-param 在标记内声明。 您可以按以下方式在servlet中访问这些参数: 如果要存储 整个应用程序 通用的数据,并且该数