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

Swift 5|如何向selector @objc传递附加参数

在Swift 5中,我们可以通过以下几种方式向selector @objc传递附加参数:

  1. Selector + 包装函数(Wrapper Function): 使用这种方式,我们可以创建一个包装函数,将需要传递的参数作为该函数的参数进行传递。然后,将包装函数作为selector传递给@objc修饰的方法。 例如:
  2. Selector + 包装函数(Wrapper Function): 使用这种方式,我们可以创建一个包装函数,将需要传递的参数作为该函数的参数进行传递。然后,将包装函数作为selector传递给@objc修饰的方法。 例如:
  3. 在这个例子中,我们创建了一个名为buttonTappedWrapper的包装函数,将button作为参数传递给了buttonTapped方法。
  4. ObjC方法调用: 如果你的项目中使用了Objective-C,你可以直接使用Objective-C的方法调用语法来传递附加参数。 例如:
  5. ObjC方法调用: 如果你的项目中使用了Objective-C,你可以直接使用Objective-C的方法调用语法来传递附加参数。 例如:
  6. 在这个例子中,我们通过withData参数传递了附加数据。
  7. 使用关联对象(Associated Objects): 关联对象允许我们将额外的对象与现有的类实例关联起来。我们可以使用Objective-C的运行时机制来实现这个目的,以便向selector传递附加参数。 例如:
  8. 使用关联对象(Associated Objects): 关联对象允许我们将额外的对象与现有的类实例关联起来。我们可以使用Objective-C的运行时机制来实现这个目的,以便向selector传递附加参数。 例如:
  9. 在这个例子中,我们使用关联对象将附加数据与UIButton实例关联起来,然后在按钮点击事件中可以通过additionalData属性获取到附加数据。

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

  • 云服务器(CVM): https://cloud.tencent.com/product/cvm
  • 云函数(SCF): https://cloud.tencent.com/product/scf
  • 云数据库MySQL版(CDB): https://cloud.tencent.com/product/cdb_mysql
  • 云原生容器服务(TKE): https://cloud.tencent.com/product/tke
  • 人工智能平台(AI): https://cloud.tencent.com/product/ai
  • 物联网开发平台(IoT Explorer): https://cloud.tencent.com/product/iotexplorer
  • 移动推送服务(TPNS): https://cloud.tencent.com/product/tpns
  • 对象存储(COS): https://cloud.tencent.com/product/cos
  • 腾讯区块链服务(TCS): https://cloud.tencent.com/product/tcs
  • 腾讯元宇宙服务(Tencent Reality): https://cloud.tencent.com/product/taas
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift 3.0介绍

编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时则必须从第二个参数开始必须指定参数名等多种情况...,而在Swift3.0中不管是函数还是方法都必须从第一个参数开始必须指定参数名(当然可以使用“_”明确指出调用时省略参数)。...(){ let _ = #selector(sum(a:b:)) } } // old: Swift 2.x //class MyClass { // @objc func...诞生在Objective-C已经发展的相当成熟的情况下,为了保证ObjC开发人员顺利过渡到Swift,也因为Swift处于初级阶段,很多类库和方法命名都尽量和ObjC保持一致,在使用Swift开发iOS...array1 = [1,2,3] array1.append(contentsOf: [4,5,6]) // old:array1.appendContentsOf([4,5,6]) array1.remove

1.3K90
  • Swift 3.0介绍

    编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时则必须从第二个参数开始必须指定参数名等多种情况...,而在Swift3.0中不管是函数还是方法都必须从第一个参数开始必须指定参数名(当然可以使用“_”明确指出调用时省略参数)。...{ let _ = #selector(sum(a:b:)) } } // old: Swift 2.x //class MyClass { // @objc func...诞生在Objective-C已经发展的相当成熟的情况下,为了保证ObjC开发人员顺利过渡到Swift,也因为Swift处于初级阶段,很多类库和方法命名都尽量和ObjC保持一致,在使用Swift开发iOS...array1 = [1,2,3] array1.append(contentsOf: [4,5,6]) // old:array1.appendContentsOf([4,5,6]) array1.remove

    1.3K80

    iOS16 和 Xcode14 如何改进 App 大小和运行时性能

    概要: 本文主要介绍苹果在 Xcode14 和 iOS 16 上,如何从编译层面和运行时层面,优化 Swift 和 Objective-C runtime, 来让 app 二进制体积更小,运行更快,启动更快...第一,用 Xcode 进行 build 时,其实是 Swift 和 Clang 编译器在工作,而当你 run app 时,很多繁重的工作是由 Swift 和 Objective-C 运行时完成。...通过使用同一 selector 进行多次调用(通过传递参数不同,内部指令是相同的,现在封装成一个存根函数,以前是散落在各个 _objc_msgSend 调用处),我们可以保存所有这些指令字节。...这些 objc_retain/release 函数只是普通的 C 函数,他们带一个参数,这个参数就是将要释放的对象。...因此,对于 ARC,编译器会插入对这些 C 函数的调用,并传递适当的对象指针。

    3.9K30

    WWDC22:Runtime 的性能优化和 App 减包

    同时通过本 Session 你将发现如何通过高效的协议检查,更小的消息发送,以及优化后的 ARC 机制,来提高你的 App 性能。...(cal, @selector(dateFromComponents)) 为了告诉运行时调用哪个方法,我们必须传递一个 Selector 给这些 objc_msgSend 调用,就如上图的 @selector..., [x1, selector "dateFromComponents"] // 执行bl指令跳转到该方法并执行 消耗4字节 bl _objc_msgSend 从上面的代码看出每次执行方法调用都会...通过使用同一 selector 进行多次调用 (通过传递参数不同,内部指令是相同的,现在封装成一个存根函数,以前是散落在各个 _objc_msgSend 调用处),我们可以保存所有这些指令字节。...12 字节优化到 8 字节,其中 _objc_msgSend$dateFromComponents 也被称为 selector stub 存根函数 同样 _objc_msgSend 本身也有一个存根函数写法

    89620

    使用 Swift 提高代码质量

    Swift特性 在讨论如何使用Swift提高代码质量之前,我们先来看看Swift本身相比ObjC或其他编程语言有什么优势。...我们的目标是如何更好的使用Swift编写出符合代码质量指标要求的代码。 提示:本文不涉及设计模式/架构,更多关注如何通过合理使用Swift特性做部分代码段的重构。...使用参数默认值,可以使调用方传递更少的参数。...值类型性能优化 考虑使用引用类型 值类型为了维持值语义,会在每次赋值/参数传递/修改时进行复制。...对于参数传递编译器在一些场景会优化为直接传递引用的方式避免复制行为。 但是对于一些数据特别大的结构,同时需要频繁变更修改时也可以考虑使用引用类型实现。

    4.7K30

    Swift4】(5) 函数基本使用 | 可变参数 | inout引用传递 | 函数类型返回值 | 函数嵌套

    { print(result.maxscore) print(result.minscore) } 内部参数名和外部参数名 func hello(userName nickname:String...一个函数最好只能设置一个可变参数,并且该可变参数只能放在这个函数参数列表的最后一个位置 必须参数 > 默认值参数 > 可变参数 func add(a:Int,b:Int,others:Int ......) ->Int //others是可变参数 ......result += num } return result } var res = add(a: 2, b: 3) res = add(a: 2, b: 3, others: 4,5,6...//CvarArg也是可变参数 inout参数 - 引用传递 inout用于声明数据是地址传递,也称之为引用传递; inout修饰的参数是不能有默认值的,有范围的参数集合也不能被修饰; 一个参数一旦被inout

    29830

    iOS开发-Runtime详解

    比如: [receiver message]; // 底层运行时会被编译器转化为: objc_msgSend(receiver, selector) // 如果其还有参数比如: [receiver message...SEL 它是selectorObjc 中的表示(Swift 中是 Selector 类)。...注意: - 不同类中相同名字的方法所对应的 selector 是相同的,由于变量的类型不同,所以不会导致它们调用方法实现混乱。 id id 是一个参数类型,它是指向某个类的实例的指针。...方法中的隐藏参数 疑问: 我们经常用到关键字 self ,但是 self 是如何获取当前方法的对象呢? 其实,这也是 Runtime 系统的作用,self 是在方法运行时被动态传入的。...当 objc_msgSend 找到方法对应实现时,它将直接调用该方法实现,并将消息中所有参数传递给方法实现,同时,它还将传递两个隐藏参数: 接受消息的对象(self 所指向的内容,当前方法的对象指针

    73270

    iOS开发-Runtime详解

    比如: [receiver message]; // 底层运行时会被编译器转化为: objc_msgSend(receiver, selector) // 如果其还有参数比如: [receiver message...SEL 它是selectorObjc 中的表示(Swift 中是 Selector 类)。...注意: - 不同类中相同名字的方法所对应的 selector 是相同的,由于变量的类型不同,所以不会导致它们调用方法实现混乱。 id id 是一个参数类型,它是指向某个类的实例的指针。...方法中的隐藏参数 疑问: 我们经常用到关键字 self ,但是 self 是如何获取当前方法的对象呢? 其实,这也是 Runtime 系统的作用,self 是在方法运行时被动态传入的。...当 objc_msgSend 找到方法对应实现时,它将直接调用该方法实现,并将消息中所有参数传递给方法实现,同时,它还将传递两个隐藏参数: 接受消息的对象(self 所指向的内容,当前方法的对象指针

    72990

    iOS runtime探究(二): 从runtime开始深入理解OC消息转发机制你要知道的runtime都在这里

    这也就是消息传递的强大之处和弊端,编译期无法检查到未定义的方法,运行期可以添加新的方法。 讲了这么多OC究竟是怎么将实例方法转换为C语言的函数,又是如何调用这些函数的呢?...name); 这一行代码同样是先注册方法setName:然后通过objc_msgSend函数将消息setName:发送给消息的接收者,只是多了一个参数传递。...objc_msgSend函数根据消息的接受者和selector选择适当的方法来调用,那它又是如何选择的呢?...sizeof(_objc_method), 5, {{(struct objc_selector *)"showMyself", "v16@0:8", (void *)_...,第二个参数是一个selector,也就是实例方法的名字,第三个参数是一个IMP类型的变量也就是函数实现,需要传入一个C函数,这个函数至少有两个参数,一个是id self一个是SEL _cmd,第四个参数是函数类型

    94370

    Swift5.0的Runtime机制浅析

    每次对象方法调用都会至少传递对象和对象方法名称作为开始的两个参数,方法的调用过程都会通过一个被称为消息发送的C函数objc_msgSend来完成。...来实现 objc_msgSend(obj, @selector(layoutSubviews); //Swift方法调用时对象参数被放到x20寄存器中 asm("mov x20, obj")...同时源代码中定义的函数的参数在编译时也不会插入附加参数Swift语言会对所有符号进行重命名修饰,类方法和全局函数也不例外。这也就使得全局函数和类方法也支持名称相同但是参数不同的函数定义。...objc_msgSend(obj, @selector(foo)); } 下面的图形展示了Swift中带@objc关键字的方法实现,以及OC语言调用Swift对象方法的实现: ?...第二个就是Swift中的类方法调用和参数传递的ABI规则和其他语言不一致。在OC类的对象方法中,对象是作为方法函数的第一个参数传递的。

    2.3K21

    聊聊Swift中的宏

    Swift中的宏分为两类: 1 - 独立宏 2 - 附加宏 其中,独立宏单独出现,单独使用,不会附加到任何声明(可以理解为原始代码)上。附加宏则需要配合声明一起使用,通常是为了原代码中增加一些功能。...附加宏 使用”@“来调用附加宏,附加宏用来补充其所声明的代码,为原始代码添加新的功能,附加宏比较复杂,后面我们再详细介绍。...2 overloaded 对原符号的重载 3 prefixed(xxx) 增加前缀 4 suffixed(xxx) 增加后缀 5 arbitrary 动态符号名称 附加宏声明 附加宏使用@attached...extension(之前为conformance,最新swift版本修改为extension):遵守着角色,为所附加的源代码增加协议和约束。...class SwiftObjcClass { // 宏展开有会增加 @objc func func1() {} // 宏展开有会增加 @objc var v1 = 0

    57210

    Swift基础语法(四)

    Result 在Swift5之前,我们一般是采用上面的方式来处理异常,在Swift5之后,苹果推出了一个Result枚举,Result枚举可以更加优雅地去处理异常。...所以在Swift5中,新增了一个枚举Result,使我们能够更简单、更清晰地处理复杂代码中的错误。...1,#selector中调用的方法需要在方法声明前面加上@objc class ViewController: UIViewController { override func viewDidLoad...那么,如何才能在一个项目中让两种语言可以相互调用呢?Apple给我们做好了桥接工作,不过,在OC项目中调用Swift,与在Swift项目中调用OC,处理的方式是不一样的。...关键字 @objc func eat() { print("吃饭了~") } } 5,在OC类中导入头文件,注意此时导入的头文件是一个命名为 项目名-Swift.h 的头文件

    3.9K20

    【自问自答】关于 Swift 的几个疑问

    Swift 版本是:4.0.3。不同版本的 Swift,可能无法复现问题。 个人记录,仅供参考,不保证严格意义上的正确性。 swift 中,如何在函数内,声明 static 变量 ?...问题描述: 全局埋点,依赖于 runtime 机制, 所以换种问法就是: swift如何继续使用 objc 的runtime 机制....若方法的参数、属性类型为Swift特有、无法映射到Objective-C的类型(如Character、Tuple),则此方法、属性无法添加dynamic修饰(会编译错误) 参考: http://www.infoq.com.../cn/articles/dynamic-analysis-of-runtime-swift 快速验证,可使用: class A{ @objc dynamic func funcA(){...> funcB 注意: swift 4 中, 加 dynamic 的同时,也必须加 @objc -- 即不允许单独加 dynamic 标记.

    1.4K60
    领券