首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Swift 3中访问super.init之前的动态类型

在Swift 3中,要访问super.init之前的动态类型,可以使用Swift的类型转换和类型检查机制。具体步骤如下:

  1. 首先,创建一个子类并重写父类的初始化方法。在子类的初始化方法中,可以通过使用type(of:)函数来获取当前实例的动态类型。
代码语言:swift
复制
class SubClass: SuperClass {
    override init() {
        let dynamicType = type(of: self)
        // 在这里可以访问super.init之前的动态类型
        super.init()
    }
}
  1. 在子类的初始化方法中,可以使用type(of:)函数获取当前实例的动态类型,并将其赋值给一个变量或常量。这样就可以在super.init()之前访问该动态类型。
代码语言:swift
复制
class SubClass: SuperClass {
    override init() {
        let dynamicType = type(of: self)
        // 在这里可以访问super.init之前的动态类型
        super.init()
    }
}
  1. 在需要访问super.init之前的动态类型的地方,可以使用之前获取到的动态类型进行操作。
代码语言:swift
复制
class SubClass: SuperClass {
    override init() {
        let dynamicType = type(of: self)
        // 在这里可以访问super.init之前的动态类型
        print("动态类型为:\(dynamicType)")
        super.init()
    }
}

需要注意的是,type(of:)函数返回的是一个元类型(metatype),可以使用.self来获取该元类型的实例。例如,let dynamicType = type(of: self).self

这样,在Swift 3中就可以在访问super.init()之前获取到动态类型了。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云服务器(CVM):提供可扩展的云服务器实例,满足各种计算需求。产品介绍链接
  • 腾讯云数据库(TencentDB):提供高性能、可扩展的数据库服务,包括云数据库MySQL、云数据库MariaDB、云数据库SQL Server等。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务,适用于存储和处理各种非结构化数据。产品介绍链接
  • 腾讯云人工智能(AI):提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift 周报 第三十六期

SE-0314引入了新 Async[Throwing]Stream 类型,作为根异步序列。这两种类型允许从同步回调(委托)桥接到异步序列。...可以通过使用可发送性强制或使用参与者限制来隔离引用类型包含对象,从而隔离引用类型存储属性。但全局变量可以从任何地方访问,所以这些工具不起作用。...它也不适用于非可发送类型,除非我们强制该值在访问它时保持隔离。...讨论[在 "super.init" 调用之前使用 "self" 与 "在 super.init 调用时未初始化属性" 冲突](https://forums.swift.org/t/self-used-before-super-init-call-conflicts-with-property-not-initialized-at-super-init-call.../66896 "在 "super.init" 调用之前使用 "self" 与 "在 super.init 调用时未初始化属性" 冲突") 我需要在 init 中创建一个捕获 self 闭包来初始化属性

22220

Swift专题讲解十五——类型构造 原

Swift专题讲解十五——类型构造 一、引言         构造是类、结构体、枚举在实例化中必须执行过程,在构造过程中,类、结构体必须完成其中存储属性构造。...官方推荐,如果一个类大多实例某个存储属性都需要相同值,强烈推荐开发者设置此存储属性默认值,这样可以很好应用Swift语言类型推断功能并且可以使代码结构更加紧凑。        ...注意,常量也需要在构造完成之前进行赋值,一旦赋值或构造完成,常量将不能被修改。...五、构造方法安全特性         Swift是一种十分注重类型安全语言,这种语言特性优势在于类在实例化后,所有的属性都是开发者明确可控。...检查4:在完成父类构造方法之前,不能使用self来引用属性。 六、构造方法继承         Swift和Objective-C有很大不同,其构造方法不会被子类无条件继承。

35710
  • 【读书笔记】The Swift Programming Language (Swift 4.0.3)

    property 必须先全部初始化 --> super.init 如果不显式调用, 系统会自动调用....在调用 super.init 之前,不能调用任何实例方法,因为对象还没有效初始化. * 用 closure 指定默认值和属性get/set 方法区别在于 声明有个等号(=),说明前者是个赋值操作....Nested Types * 支持类型嵌套定义,这已经是很大突破了. * 即使在函数内部,也可以定义新类型. * 可以用.语法,访问嵌套定义类型....Access Control * 默认访问级别是 internal,可以在定义它模块内各个源文件之间自由使用. * fileprivate 和 private 并存,是因为swift中允许类型嵌套定义.... * 子类访问级别不能比父类更宽松;但是子类可以通过重写机制,使父类成员访问级别变更宽松.

    1.5K100

    swift 构造器

    构造器 使用构造器来实现构造过程,构造器可以看做是用来创建新实例特殊方法,与OC构造器不同,之前是先调用父类init再写自己, 但是到了Swift里面, 我们却先初始化自己, 再初始化父类, 是相反...,swift中构造器无需返回值,主要任务是保证新实例在第一次使用前完成正确初始化 为存储属性赋初始化值 类和结构体创建实例时,必须为所有存储类型设置初始值 可以在构造器中设置, 也可以在声明属性时候就给定...并且你只能在构造器内部调用self.init 如果你为某个值类型定义了一个自定义构造器,你将无法访问到默认构造器(如果是结构体,还将无法访问逐一成员构造器) struct Size { var...类里面的所有存储型属性,包括所有继承自父类属性,都必须在构造过程中设置初始值 Swift 为类类型提供了两种构造器来确保实例中所有存储型属性都能获得初始值,它们分别是指定构造器和便利构造器 指定构造器...4.构造器在第一阶段构造完成之前,不能调用任何实例方法,不能读取任何实例属性值,不能引用self作为一个值 构造器继承和重写 跟 OC 中子类不同,Swift子类默认情况下不会继承父类构造器

    18010

    Swift 类构造器使用

    程序员连自己写源代码都不想读, 怎么可能看别人写源代码! 每半年获得知识相当于之前获得全部知识总和. 个人觉得这句话还是蛮有道理....当定义一个指定构造器时候, 必须调用父类某一个指定构造器: Swift 复制代码 init(imageName: String, prompt: String = "") { super.init...如下图所示: 在图中, 只有指定构造器才可以调用父类指定构造器, 而便利构造器是不可以, 这也遵循了我们之前所说三条规则. 只要 init 方法遵循这三个规则就不会有任何问题....阶段 2 从顶部构造器链一直向下, 每个构造器链中类指定构造器都有机会进一步定制实例. 构造器此时可以访问 self, 修改它属性并调用实例方法等等。...(style: .Default, reuseIdentifier: nil) 之前并没有初始化自己所有属性.

    1.7K20

    Swift基础-init详解

    前言 在讲解Swiftinit之前,默认都有Swift开发基础,了解关键字designated,Optional,override,convenience等。...规则 Swift有着超级严格初始化方法,具体看来: 对于结构体而言,默认初始化方法会带出所有的属性;自定义初始化方法后默认初始化失效; ?...struct.png 定义了一个结构体Person,声明了Int类型age和String类型name,在创建实例时候提供默认初始化方法 Person(age: Int, name:...class.png 子类强制调用super版本designated初始化; 初始化方法顺序:先初始化本类属性,再初始化父类; 目的 在深入讲解初始化方法之前,不妨先思考下Swift初始化想要达到一种怎样目的...虽然Apple也明确说明了不应该在init中使用属性来访问,但这并不是编译器强制,因此还是会有很多开发者犯这样错误。所以Swift有了超级严格初始化方法。

    1.2K20

    Swift中构造方法解析 原

    required init(three:Float) {         tip=10         super.init()     } 上面示例代码中,不带参数init()方法为复写父类方法...构造方法1,2,3都是对init()构造方法一种重载,但却是3中类型全然不同构造方法。...2.如果子类复写了父类某一构造方法,则子类默认不在继承所有父类构造方法,对于Designated类型构造方法,子类复写了哪些,哪些才能够被使用,对于Convenienve类型构造方法,子类复写其调用...五、构造方法实现原则       无论Designated类型构造方法还是Convenience类型构造方法,只要其有父类,最终都要实现父类Designated构造方法。...在对成员常量或变量进行构造赋值时,要在调用父类初始化方法之前,这里还有一点需要注意,父类成员属性也会被子类继承,如果要在子类复写父类方法中对继承来父类成员属性进行重新构造或赋值,则必须在调用父类构造方法之后

    1K20

    应用程序内购买教程:入门

    通过允许用户购买或解锁内容或功能,了解如何在此应用内购买教程中增加应用收益。 ?...如果这些是不熟悉主题,那么 在开始之前查看我们Swift教程范围。您还需要一个付费开发者帐户,可以访问iOS开发人员中心 和App Store Connect。...您可以添加一大堆不同类型IAP: 消耗品:这些可以多次购买,可以用完。这些非常适合额外生活,游戏内货币,临时加电等。 非消耗品:您购买一次东西,并期望具有永久性,额外水平和可解锁内容。...仍然在IAPHelper.swift,回去init(productIds:)和右侧添加以下行之后 super.init()。...Swift Shopping RazeFace 恢复购买 如果用户删除并重新安装应用程序或将其安装在其他设备上,则他们需要能够访问以前购买项目。

    5.4K20

    设计模式之创建型模式

    示例语言选用静态语言 Swift(其实个人认为设计模式主要还是针对静态语言,很多模式在动态语言中都用处不大)。...原型将某个实例对象作为“原型”,通过复制这个原型来创建新对象,由于可以动态指定原型,所以可以在运行期改变创建产品。...像 Self、JavaScript 这样基于原型语言可以说处处都用到了原型模式,而像SmallTalk、OC、Ruby 等动态语言中,类本身可以当作对象传递并用其创建实例对象,甚至在 Swift 中也可以直接用所谓类型...它最大优点是灵活性,可以动态指定要创建对象,而这点,可以通过传递“元类型”或者利用范型轻易做到。...,只不过这样在使用时候就需要明确指出需要创建产品类型了: //用范型控制产品类型,不需要定义一堆 UIFactory 子类。

    65240

    Swift基础 初始化

    与Objective-C初始化器不同,Swift初始化器不会返回值。他们主要作用是确保一种类型新实例在首次使用之前被正确初始化。...请注意,如果您为值类型定义自定义初始化器,您将无法再访问类型默认初始化器(或成员初始化器,如果是结构)。...使用两阶段初始化过程使初始化安全,同时仍然为类层次结构中每个类提供完全灵活性。两阶段初始化可以防止属性值在初始化之前访问,并防止属性值意外地被另一个初始化器设置为不同值。...注意 Swift两阶段初始化过程类似于Objective-C中初始化。主要区别在于,在第1阶段,Objective-C为每个属性分配零或零值(0或nil)。...因此,您必须在子类初始化器定义之前编写override修饰符。即使您重写自动提供默认初始化器,也是如此,默认初始化器所述。

    16100

    Swift开发:自定义标签栏UITabBarController (Swift项目开始第一步)

    Swift学习过程中,个人感觉虽说两种语言相似度很大,但是Swift依然在代码风格上有着和OC很大差异。...在总结了一些基本用法之后,我尝试使用Swift自定义UITabBarController和UITabbar,开启这Siwft项目的关键一步,首先展示一下效果图: ?...{ //1.调用父类初始化方法 super.init(nibName: nil, bundle: nil) //2.读取Plist文件,初始化标签栏配置数组...String for i in 0...controllerNameArray.count-1 { //动态获取命名空间是不包含., 所以需要我们自己手动拼接...类型, //因为Swift中通过一个Class来创建一个对象, 必须告诉系统这个Class的确切类型 if let vcClassType = anyClass

    4.2K70

    19.Swift学习之构造函数与析构函数

    重要说明 本文中提到构造函数,在很多书中有其他说法,构造器,构造方法,初始化,初始函数等 本文中提到析构函数,在很多书中有其他说法,反构造器,析构方法,反初始化,反初始函数等 构造函数介绍...注意如果为值类型定义了自定义构造函数,就不能访问默认构造函数或者是成员构造函数 类继承和初始化 所有类存储属性——包括从它父类继承所有属性都必须在初始化期间分配初始值。...Swift 为类类型定义了两种构造函数以确保所有的存储属性接收一个初始值。这些就是所谓指定构造函数和便捷构造函数 指定构造函数是类主要构造函数。...: convenience init(parameters) { statements } 类类型构造函数委托 为了简化指定和便捷构造函数之间调用关系,Swift 在构造函数之间委托调用有下面的三个规则...类类型构造函数委托 构造函数继承与重写 在Swift中,子类构造函数有两种来源,首先是自己拥有的构造函数,其次是从父类中继承过来构造函数。但是,比不是所有父类构造函数都能够被子类继承。

    1K30

    深入了解 iOS 初始化

    从 iOS 初始化核心规则展开而来,Swift 多了一些规则: • 初始化时候需要保证类(结构体、枚举)所有非可选类型属性都会有值,否则会报错。...• 在没有给所有非可选类型属性赋值(初始化完成)之前,不能调用self相关任何东西,例如:调用实例属性,调用实例方法。...} 如果子类有新非可选类型属性,或者无法保证所有非可选类型属性都已经有默认值,则需要新创建一个指定初始化器,或者重写父类指定初始化器 • 新创建一个指定初始化器,会覆盖父类指定初始化器,需要先给当前类所有非可选类型属性赋值...必须重写旧定初始化器,在里面调用新指定初始化器 • 在 Swift 中,初始化时候需要保证类(结构体、枚举)所有非可选类型属性都会有值 • 在 Swift 中,必须在初始化完成后才能调用实例属性...,调用实例方法 • 在 Swift 中,如果存在继承,并且子类有新非可选类型属性,或者无法保证所有非可选类型属性都已经有默认值,那么就需要新创建一个指定初始化器,或者重写父类指定初始化器,并且在里面调用父类指定初始化器

    1K10
    领券