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

NSClassFromString在OC中运行良好,但在Swift中崩溃

NSClassFromString是Objective-C中的一个函数,用于根据字符串获取对应的类对象。在Objective-C中,可以通过该函数动态地创建类的实例或调用类的方法。

然而,在Swift中使用NSClassFromString函数可能会导致崩溃。这是因为Swift是一门静态类型语言,其编译器在编译时需要确定所有的类型信息。而NSClassFromString函数是在运行时根据字符串获取类对象,这与Swift的静态类型特性相冲突。

为了在Swift中实现类似的功能,可以使用Swift的反射机制。Swift的反射机制允许在运行时获取类型信息,并进行动态操作。通过使用Swift的Mirror类型,可以获取类的类型信息,包括类名、属性、方法等。然后可以根据类名字符串创建类的实例或调用类的方法。

以下是一个示例代码,展示了如何在Swift中使用反射机制实现类似NSClassFromString的功能:

代码语言:swift
复制
func createInstance(className: String) -> Any? {
    guard let classType = NSClassFromString(className) as? NSObject.Type else {
        return nil
    }
    let instance = classType.init()
    return instance
}

func callMethod(className: String, methodName: String) {
    guard let classType = NSClassFromString(className) as? NSObject.Type else {
        return
    }
    let instance = classType.init()
    let selector = Selector(methodName)
    if instance.responds(to: selector) {
        instance.perform(selector)
    }
}

// 使用示例
let className = "MyClass"
if let instance = createInstance(className: className) {
    print("Successfully created instance of \(className)")
} else {
    print("Failed to create instance of \(className)")
}

let methodName = "myMethod"
callMethod(className: className, methodName: methodName)

在上述示例中,createInstance函数根据类名字符串创建类的实例,callMethod函数根据类名字符串和方法名字符串调用类的方法。需要注意的是,这里使用了Objective-C的NSClassFromString函数来获取类对象,因为Swift中没有直接的方法可以根据字符串获取类对象。

总结:在Swift中,由于其静态类型特性,NSClassFromString函数无法直接使用。可以通过使用Swift的反射机制来实现类似的功能,包括创建类的实例和调用类的方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

从Mach-O角度谈谈SwiftOC的存储差异

导读 本文从二进制的角度初步介绍了SwiftOC的差异性,包括Swift可执行文件函数表的存储结构、函数的存储结构等(目前只列出基本结构,泛型等结构描述会陆续补充)。...OC版本的二进制解析工具已经开源,针对Swift的二进制解析工具目前正在开发,近期即将发布,敬请关注WBBlades~ 背景 经过数年的更新,Swift的ABI终于稳定了。...的存储 为什么OC能够在运行时找到类和方法呢?...Swift 不论是OC类还是Swift类,都会被存储到__objc_classlistSwift类完整的保留了OC的存储结构。...如果此时你打开MachOView,查看__swift5_types的二进制数据后你会发现它与OC的存储有很大的不同。OC,存储地址通常都是8字节的直接存储对应的地址。

1.6K50

iOS开发·runtime+KVC实现多层字典模型转换(多层数据:模型嵌套模型,模型嵌套数组,数组嵌套模型)

更重要的是,有时候iOS面试的时候,部分面试官会不仅问你某种场景会用到什么框架,更会问你如果要你来实现这个功能,你有没有解决思路?所以,自己实现字典转模型还是有必要掌握的。...有了这个基础,利用运行时runtime的动态特性,你也可以实现这些第三方框架。...字典转模型:Runtime 思路1:利用运行时,首先要遍历参数字典, 如果我们获取得属性列表包含了字典的 key,就利用 KVC 方法赋值,然后就完成了字典转模型的操作。...思路2:利用运行时,遍历模型中所有属性,根据模型的属性名,去字典查找key,取出对应的值,给模型的属性赋值,然后就完成了字典转模型的操作。...运行验证 ?

2.5K10

译文: 低调奢华有内涵的「Runtime」

(译者:这篇文章发表于2016年10月4日,那时候刚更新Xcode8) 为什么还要聊OCSwift3.0不是要干死Objective-C了吗? 此言差矣。...(译者:操场——playground,是Swift的一个工具,用于学习、验证Swift)。 Swift的一个核心功能就是可以和OC进行混编。这两种语言可能根本上不一样,但实际上可以很好地互补。...没有改变OC应用的行为,OC对于开发者来说仍然是一种可读性好的开发语言。...感谢Objective-C的Runtime,我们可以运行时」为这个对象添加缺失的方法(方法的实现为空),这样就可以防止这个崩溃了。...虽然不是一种理想的解决方案,但在等真正导致问题的修复发布前,Runtime确实帮忙防止了成千上万这种崩溃(译者:通过class_addMethod()函数,可以+ (BOOL)resolveInstanceMethod

95040

Swift基础语法(一)

Swift的打印语句是print var str = "Hello, playground" print(str) OC,分组注释使用 #pragma mark - 但是Swift,分组是使用...循环 C/OC,常见的循环有for/while/do-while;Swift,对应的循环有for/while/repeat-while。...字符串 OCSwift的字符串是有区别的: OC,字符串类型是NSString;Swift,字符串类型是String。 OC定义字符串是使用@"";Swift定义字符串是使用""。...可选型 OC,如果一个变量暂时不使用,可以赋值为0(基本数据类型)或者赋值为nil(对象类型)。OC,nil就表示一个空指针,它并不作为一个特殊的类型。...1,我们之前提到,数组的元素必须是相同的类型,但是这里我定义数组的时候,其中的元素是不同类型的,但是也能正常编译运行,是因为我给数组的元素定义的是 Any 类型,这就表示数组的元素可以是任意类型

4.2K30

Swift基础语法(四)

出于安全的考虑,我们需要在暴露给OC使用的类、属性和方法前面加上@objc。那么Swift,哪些地方用到了这个关键字呢?...Apple给我们做好了桥接工作,不过,OC项目中调用Swift,与Swift项目中调用OC,处理的方式是不一样的。...4,Swift文件内容如下: import UIKit class NormanPerson: NSObject { //Swift代码,将需要暴露给OC调用的属性和方法前面加上@objc...6,OC代码调用Swift: #import "ViewController.h" //导入"项目名-Swift.h文件" #import "NormanOC-Swift.h" @interface...命名空间 命名空间(nameSpace)C++、C#是一个常见的概念,OC是没有命名空间的概念的,但是Swift引入了命名空间的机制。

3.9K20

iOS 登录接口封装实践

基本所有APP都少不了,开始写APP,可能首先就是从登录开始 我也一样,我手上有一个封装了所有账户体系相关接口的SDK,运行良好但也遇到一些烦心事,就拿登录来说说吧。...并且最终我也是这么做的,可我还是想在Swift能够更好的使用Swfit特性,写出更简洁的代码。。所以我写了两套接口。。。。...,一套OC使用,一套Swfit使用,因为我总觉得不久的将来,我就不需要支持OC了: 首先增加了一个OC的类型枚举: @objc public enum AccountType_OC: Int {...即变相达到了,Swift 代码不会出现这个方法,只有下面方法可以使用: func login(by accountType: AccountType, password: String, res:...基本就是这样了,看起来很麻烦,也确实挺麻烦,其实完全可以只保留OC使用的方法,这完全归于我的代码洁癖,以及我自己使用Swift和对于日后去掉OC支持时我可以快乐的删代码的白日幻想。

77420

详解SwiftOC的混编

前言:      我们一些情况下,仅仅使用swift 是无法完成一个项目的,swift项目中必要用到 OC 实现一些功能,比如,项目要使用一些第三方的框架,但这个第三方的框架却是用 OC 实现的,或者你的项目必须调用原有项目的部分功能...类型的文件中用到OC的文件时候,你就把OC的头文件加到这个 新添加的文件,如上图,我把 octestViewController.h 加到了这个文件。...你OC项目中加swift类型文件,也会有一个桥头文件生成。你要在OC文件中用swift类型的文件呢,也一样。。...build setting 搜 swift 把头文件导入你的OC文件,你要在swift文件中用OC类型文件呢,也是一样把 OC 类型文件的头文件导入桥头文件中就OK了,顺便说一句,我一些书上看到的...,说 swift类 定义的前面叫 @Objc的类才能被OC类调用是不正确的,以前可能是这样子的,但在swift3.0不需要!

1.1K80

swift文件调用oc分类时崩溃解决办法(可能全网唯一)

背景 oc为基础创建的sdk混编工程,在被sdk关联的混编demo工程swift文件调用时,会崩溃,提示找不到sdkoc分类方法。...常规的,demo设置-Objc和-all_load也还是会崩。 工程配置: ? 网上找了一圈都找不到能解决此问题的答案。...峰回路转 微信群里提问后,经热心群友提示,尝试了 force load 方法,不过还是不行。 有感而发,联想到应该就是文件关联问题。...再运行,真的可以了!不崩溃了! 真好,感谢群友! 小结 把编译出的包放到 link binary with libraries 里,就可以了!... Stack Overflow 里也分享了这个坑,希望能帮到遇到类似问题的朋友: https://stackoverflow.com/questions/3998483/objective-c-category-causing-unrecognized-selector

97230

运行时Hook所有Block方法调用的技术实现

本技术实现在YSBlockHook。 1.方法调用的几种Hook机制 iOS系统中一共有:C函数、Block、OC类方法三种形式的方法调用。...Hook的机制有很多种,通常良好的Hook方法都是以AOP的形式来实现的。...不管如何只要是对OC对象执行赋值拷贝操作,最终内部都会调用retain方法。 Block对象也是一种OC对象!! 每当一个Block对象需要进行赋值或者拷贝操作时,也会激发对retain方法的调用。...然后就可以统一的Hook函数内部读取这个保留字段的保存的原始invoke函数来执行真实的方法调用了。...如果你不想借助Block_descriptor的reserved来保存原始的invoke函数,那么可以参考我的文章:Thunk程序的实现原理以及iOS的应用(二)中介绍的技术来实现统一Hook函数以及完成对原始

1.2K20

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

Swift的学习过程,个人感觉虽说两种语言的相似度很大,但是Swift依然代码风格上有着和OC很大的差异。...总结了一些基本的用法之后,我尝试使用Swift自定义UITabBarController和UITabbar,开启这Siwft项目的关键一步,首先展示一下效果图: ?...第二步:准备资源文件 1.Assets.xcassets存放标签栏按钮所需要的图片资源 ?...屏幕快照 2017-07-15 下午1.52.29.png 2.创建标签配置Plist文件,并且Plist文件设置视图控制器的类名、Title、标签栏图片等信息 ?...rootViewController = MainTabBarController(); return true } 总结:以上就是OC代码的基础上,使用Swift来自定义标签控制器的方法和步骤

3.9K70

Swift2转Swift3

以下是代码改朝换代的时候的一些心得: OC 代码转换为 swift 代码的时候,我当时使用的是 xcode7.3。xcode7.3我的印象,编写OC代码就是联想功能最差的一个。...所以: 一、更新swift的时候,swift文件,几乎是不会联想的,动则就是整个屏幕的代码全是白颜色,然后,类名,方法名,都是硬敲出来的。...并且 block 非option 的都要加上 @escaping 来修饰 六、swiftiOS8 机型,所有的控制器使用 xib 的情况下,都要对初始化方法 init(nibName:nibBundle...)这个方法重写,否则崩溃 七、增加桥接文件 以上几点都是转码的时候耗费时间比较长、存在坑的。...在这点印象颇深 二、更新第三方库为 swift 版,因为虽说允许OC swift混编,但是类型这个方面兼容性并不是太好。

1.9K50

OC学习9——反射机制

1、OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作。...直接调用运行时函数进行动态编程:运行时系统是一个动态共享库,有一些列位于usr/include/objc目录的头文件的函数和数据结构组成,这些工具都是C风格,他们并不是OC必需的,但有些函数OC编程也是有用的...说到反射,首先我们要弄清楚什么是反射,反射的定义是运行的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。 ...OC获得Class通常有3种方法: 使用Class NSClassFromString(NSString * aClassName)函数来获取Class,该函数需要传入字符串参数,该字符串的值是某个类的类名...为了程序动态获得SEL对象,OC提供了如下两种方法来获得: 使用@selector指令来获取房前类制定的方法,该指令需要用完整的方法签名关键字作为参数,仅有方法名是不够的 使用SEL NSSelectorFromString

2K50

Objective—C语言的新魅力——Nullability、泛型集合与类型延拓

这些功能都只作用于编译期,对程序的运行并没有影响,因此,它可以很好的向下进行兼容,无缝的衔接低版本的iOS系统,那么这些特性有什么样的用处呢,作为开发者,我保证你一定会爱上他们,如果你可以将这些新特性都应用于你的开发...二、Nullability检测的支持         swift语言中,通过!和?可以将对象声明成Optional,用于开发中标记这个对象是否可以为空。...OC,以前是没有这样的功能的,因此我们开发中会经常遇到因为某个函数应该返回实例而返回了空导致的崩溃。...注意: 这一特性Xcode6.3就已经支持,但在Xcode7又做了一些写法上的小改动,例如,Xcode6.3这样写: -(void)setValue:( nonnull NSNumber *  ...五、结语          虽然这些优点在swift早有体现,但就我个人而言,我对OC的感情会更深一些,也更加愿意接受OC的改变和成长,大家都说swift的趋势势在必行,我只想说,swift很优秀,OC

98730
领券