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

Swift参数在Objective C函数中不可见吗?

在Objective-C中调用Swift函数时,Swift参数默认情况下是不可见的。这是因为Swift使用了一种称为Objective-C桥接的机制,将Swift代码暴露给Objective-C使用。在Objective-C中,函数的参数是通过方法名来传递的,而不是通过参数名。因此,Objective-C无法直接访问Swift函数的参数。

然而,可以通过使用NS_SWIFT_NAME宏来显式地指定Objective-C中的函数名,以使参数可见。通过在Swift函数声明前添加@objc属性,并使用NS_SWIFT_NAME宏指定Objective-C中的函数名,可以将参数暴露给Objective-C。

例如,假设有一个Swift函数如下:

代码语言:txt
复制
@objc func doSomething(with parameter: String) {
    // do something
}

可以使用NS_SWIFT_NAME宏将其映射到Objective-C中:

代码语言:txt
复制
@objc(NSObject_doSomethingWithParameter:)
func doSomething(with parameter: String) {
    // do something
}

这样,在Objective-C中调用该函数时,参数将是可见的:

代码语言:txt
复制
[self doSomethingWithParameter:@"example"];

总结起来,Swift参数在Objective-C函数中默认情况下是不可见的,但可以通过使用NS_SWIFT_NAME宏显式地指定Objective-C中的函数名来使其可见。

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

相关·内容

Objective-C编写省略参数的多参函数

Objective-C编写省略参数的多参数函数 引语: Object-C,我们会遇到很多像NSLog这样的函数,其中参数的个数不确定,由程序员自由控制,初始化数组,字典等方面应用广泛,那么,这类的函数是如何实现的呢...我们怎么编写我们自己的省略参数函数呢?当然,这不是唯一的多参函数的处理方法,你也可以通过一个字典或者数组传递参数。但C为我们提供的这样的一种机制,无疑是最方便的。...,比如如果一个函数参数如下: void func(int a,int b,int c,int d) 那么传递参数的时候参数d先入栈,接着是c、b、a。...如此这样,取参的时候,根据堆栈的取值原则,则取值顺序为a、b、c、d。所以原理上,只要我们知道第一个参数的地址和每个参数的类型,我们就可以将参数都取出来。.../必须有nil 四、一点补充 细心的你可能发现了,这里的nil是我们调用函数时手动加上的,可是系统的许多函数我们调用时,系统直接帮我们加上了参数结尾的那个nil,例如 NSArray * array

99410

Swift编译之SIL(Swift Intermediate Language)

SIL常见语法 hidden:同一个 Swift 模块的对象可见。...@convention(objc_method):Objective-C 方法的引用。 @convention(block):Objective-C 块的引用。...,即它不会在模块之外可见 // @main.Person.drink():这是函数的完全限定名称,指明了该函数属于main模块的Person类的drink()方法 // -> ():表示函数的返回类型为空元组...,即函数返回任何值 // : $@convention(method):这部分指定了函数的调用约定,表明这是一个方法,Swift,方法调用与函数调用有一些不同之处,例如它们使用隐式的self参数...// (@guaranteed Person) -> ():这是函数参数列表@guaranteed是一个生命周期修饰符,表示参数Person整个函数调用期间都是有效的Person 是参数的类型,表示该方法调用时需要一个

22141

Swift 范的 CGRect、CGSize 和 CGPoint(转)

从我决定拥抱 Swift 到现在已经 8 个月了。这几个月中,我一边学习着如何避免写出 Objective-C 风格的 Swift 代码,一边真正开始使用这门新语言。...这些语句早已烂熟于心,他们根本不会去纠结 CGGeometry 结构体的这些参数代表什么。 Swift 很多方面对初学者都很友好,无论你是刚接触 Swift,还是刚接触编程。...: 100, height: 100) let point = CGPoint(x: 0, y: 0) 每个参数前面都有了参数描述,这一点描述,就已经能让我们第一眼明白代码含义了。...我们也应该将这种写法替换成 Swift 风格。别怕,只是多了一个字符而已。你能猜到怎么写?...CGFloat width = frame.size.width CGFloat height = frame.size.height 你的程序应该避免直接读写 CGRect 的值,取而代之的是,采用对应的函数来处理相关参数

7.3K30

Swift是花拳绣腿?——谈谈开发语言与程序员的职业发展

在下面的代码,repeat函数可以接受一个闭包类型的task参数调用repeat函数时,传入的第二个参数是一个函数体,其中包含了一行打印语句。 那么什么是闭包呢?...比如Java和C#的Lamda表达式: 这是一段C#代码,delegate关键字用于定义一个函数签名。比如用del为名称,定义了一个参数int返回int的函数。...Swift中使用泛型很方便,语法和Java、C#、C++也很类似。 不过使用Objective-C的朋友也有福了,在即将发布的XCode7Objective-C也支持泛型了。...如果与 Objective-C比较,Swift书写效率上完胜。 在编译效率上,由于Swift没有.h头文件和一些其他特性,因此比Objective-C在理论上要快。...Swift是花拳绣腿Swift就好比是一套武功招式,它能否发挥巨大威力,取决于招式本身,而取决于使用者内功。只有自己变强,才能将Swift的特性得到淋漓尽致的发挥,做出优秀的应用。

1.4K30

《Motion Design for iOS》(二十一)

我们的例子,我们要将它添加到redBall上去。...我们可以将“transform.scale”传入到forkey:的参数,但我们也可以只传入准确的我们创建的动画关键路径,这样我们就不会混淆JNWSpringAnimation的关键路径和我们要协调动画时使用的关键路径...现在如果你想要在Swift工程中使用JNWSpringAnimation,由于你是使用一个Objective-C框架,你需要使用一些称为“桥街头”的东西让Xcode知道你想要在你的Swift代码中使用非...Objective-C头文件都会被设为Swift可见,这样你就可以使用Swift来交互它们的Objective-C函数。...这就是Swift代码和Objective-C代码会创建的一样的动画。 查看完整合集:https://github.com/Cloudox/Motion-Design-for-iOS 查看作者首页

37420

Swift进阶一:Swift简介

SwiftObjective-C的主要区别 1,编程范式 Swift可以面向协议编程、函数式编程、面向对象编程。...而在Objective-C,枚举则鸡肋很多,它只是一个标记值而已。 5,泛型 Swift是支持泛型的,也支持泛型的类型约束等特性。 Objective-C则没有泛型的概念。...同时,Swift的protocol还可以用于值类型,比如结构体和枚举。 Objective-C的协议相对于Swift,则显得寒酸很多。...7,函数和闭包 Swift函数是一等公民,可以直接定义函数类型的变量,可以将函数作为其他函数参数来传递,也可以将函数作为其他函数的返回值。这些特性可以让我们Swift中进行函数式编程。...Objective-C函数仍然是次等公民,我们需要对其进行selector的封装或者利用block来实现Swift类似的效果。

2.8K20

Swift 是猴还是猿?

Swift 结合了CObjective-C 的优点并且不受 C 兼容性的限制。Swift采用安全的编程模式并添加了很多新特性,比如范型、闭包、函数式编程等,使编程更简单,更灵活,也更有趣。...即搞定,不再需要像oc里面需要写if判断或是问号表达式,Swift变得更加简洁。 布尔值 C/Objective-C,if、while、for之后的判断式并不需要一定传入布尔类型。...9.强制使用大括号 C/Objective-C,if、while、for之后的语句假如只有一行,是可以省略掉大括号的 。...Eg: 元组的最大用途函数可以返回多个值: 闭包 Swift里面定义一个闭包,闭包 = {(形参) -> 返回值 in 代码实现},in 用于区分函数定义和代码实现: 最简单的闭包,如果没有参数...实际应用,通常需要一个更实用更灵活的函数来交换两个任意类型的值,Swift里面通过范型来解决。

3.8K30

【面试必备】Swift 面试题及其答案

Objective-C,引用类型的变量是可以缺少值得,并且使用nil作为缺少值。基本的数据类型如int 或者float没有这种功能。...Swift函数和数据结构中都可以使用泛型,例如类、结构体和枚举。 泛型一般是用来解决代码复用的问题。...很难说Swift是一个成熟的函数式语言,但是它已经具备了函数式语言的基础。 问题2- Swift 1.0 or later 下面的功能特性都包含在Swift?...问题3- Swift 1.0 or later Objective-C,一个常量可以这样定义: const int number = 0; 类似的Swift是这样定义的: let number = ...高级 问题1- Swift 1.2 Swift1.2版本,你能解释一下用泛型来声明枚举的问题

2.7K20

【iOS 开发】NSError ** 与 throws 的三个问题

为什么需要 BOOL 返回值,这是一个冗余的设计?...另外,基于 Objective-C 的语言特性,这里我们无法阻止调用者对 error 参数传递 nil,但是这个方法在这种情况下依然需要告知调用者是否执行成功,所以返回值是一个必要的设计。...上面那个方法 Swift 是这样的: func removeItem(atPath path: String) throws 没有返回值 Objective-C 为了对外部创建的 NSError..., _ b: inout Int) { let temporaryA = a a = b b = temporaryA } 这实现了函数修改参数值,按照这种写法,是不是我们可以臆想出一种完全对应于...Objective-C 风格的版本: func removeItem(atPath path: String) throws // 原版 func removeItem(atPath path: String

1.9K20

【面试必备】Swift 面试题及其答案

Objective-C ,引用类型的变量是可以缺少值,并且使用 nil 作为缺少值。基本的数据类型如 int 或者 float 没有这种功能。... Swift 函数和数据结构中都可以使用泛型,例如类、结构体和枚举。 泛型一般是用来解决代码复用的问题。...很难说 Swift 是一个成熟的函数式语言,但是它已经具备了函数式语言的基础。 问题2- 下面的功能特性都包含在 Swift ?...问题3- 常量定义的区别 ---- Objective-C ,一个常量可以这样定义: const int number = 0; 类似的Swift是这样定义的: let number = 0 两者之间有什么不同...高级 问题1- 能解释一下用泛型来声明枚举的问题 ---- Swift ,你能解释一下用泛型来声明枚举的问题

6K30

汇编寄存器的规则

判断是否有参数的一种简单方法是简单地检查 Objective-C 选择器的冒号。 每个冒号将代表一个方法参数。...还记得RDI是第一个参数,而RSI是第二个参数?LLDB,可以通过arg{X}形式来引用寄存器,其中X是参数号。还记得RDI是第一个参数,而RSI是第二个参数?...LLDB,可以通过argX形式来引用寄存器,其中X是参数号。还记得RDI是第一个参数,而RSI是第二个参数?LLDB,可以通过 arg1 引用第一个参数 (RDI)。... Objective-C ,RDI 寄存器是调用 NSObject 的引用,RSI 是选择器,RDX 是第一个参数,依此类推。...RAX 寄存器用于函数的返回值,无论您使用的是 Objective-C 还是 Swift。 您可以利用寄存器做很多事情。尝试浏览您没有源代码的应用;将为解决棘手的调试问题奠定良好的基础。

2.4K50

Swift构造方法的解析 原

Swift构造方法的解析 一、引言       构造方法是一个类创建对象最先也是必须调用的方法,Objective-C,开发者更习惯称这类方法为初始化方法。...Objective-C的初始化方法与普通函数相比除了要以init抬头外并无太严格的分界,而在Swift语言体系,构造方法与普通的方法分界十分严格,从格式写法上就有不同,普通方法函数要以func声明...二、构造方法的复写与重载      Objective-C,不同的初始化方法就是不同的函数,这便不存在方法重载的概念。Swift要创建自定义的构造方法,需要开发者对init构造方法进行重载操作。...曾经有朋友和我抱怨,Objective-C的继承是一种十分人性,它强制子类继承所有父类的方法与属性无论子类是否需要,分析上面的一些规则可以发现,SwiftObjective-C相比,构造方法方面语法会更加严格...使用Objective-C进行开发时,很多初学者都可能会遇到这样一种情况,完成了某个类的初始化,但向类的属性进行赋值时却没有成功,因为Objective-C并没有这样的语法,类初始化成功后,其属性是否初始化了完全取决于开发者

1K20

Swift讲解专题七——函数

事实上Swift,每个函数都是一种类型,这种类型由参数和返回值来决定。SwiftObjective-C的一大区别就在于Swift函数可以进行嵌套。...") } sayHello() 上面介绍的函数类型都比较常见,对于多返回值的函数Objective-C十分难处理,开发者通常会采用字典、数组等集合方式或者干脆使用block回调,Swift,可以使用元组作为函数的返回值...Int) { print(param,param2,param3) } func4(3,param3:3) 还有一种情形Objective-C也很处理,对于参数数量不定的函数,在前面章节介绍过...,Objective-C一般会使用list指针来完成,Swift编写这样的函数十分简单,示例如下: func func5(param:Int...) { for index in param { print(index) } } func5(1,2,3,4) Swift参数默认是常量,函数是不能修改外部传入参数的值得

34330

27.Swift学习之与OC混编

目前iOS开发语言从Objective-CSwift的过渡时期,开发难免会碰到两种语言同时存在的情况,如果在同一个项目中,两种语言并存,那么该项目就是一个混合项目。...Apple给我们做好了“桥接”工作,但是Objective-C的项目中调用SwiftSwift项目中调用Objective-C,处理的方式是不一样的,下面来进行一个简单的介绍。...混合项目提示信息.png 这短话的大意:添加这个文件会创建一个Objective-CSwift的混合项目,你是否希望Xcode自动配置一个桥接头文件来让两种语言的类文件相互可见?...Swift文件如下: class Person: NSObject { } Objective-C的类中导入头文件,注意此时导入的头文件是一个命名为项目名-Swift.h的头文件,而不是Bridging...项目中调用Objective-C 新建一个Swift的iOS项目 创建一个Objective-C的类,此时也会有如一的文字提示,修改类文件如下: @interface Person : NSObject

1.2K10

Swift解读专题一——Swift2.2语言预览

语言与Objective-C、Java语言的函数特点:         Objective-C实际上并没有函数重载的概念,不同参数函数实际上拥有不同的函数名,Objective-C的风格将参数名嵌套进函数...Objective-C,如果需要某个函数返回一组值,开发者通常会需要使用字典或者数组,这样做有一个问题,调用此函数时,返回值的意义十分模糊,开发者需要明确的知道其中数据的顺序与意义。...print(statistics.max) //通过角标取元组的最小值 print(statistics.0)         对于可变参数个数的函数Objective-C,开发者大多会采用va_list...Swift同样也有set和get方法,只是这里的set和get方法与Objective-C的set和get方法有很大的不同,Objective-C的get和set方法是截获了属性和存取过程,在其中加入额外的其他操作...的枚举和CObjective-C有很大的差别,Swift,枚举也被作为一种数据类型来处理,其中可以添加函数方法。

2K20

Swift 周报 第三十七期

基于值和类型参数包提案 SE-0393 的基础上,这个提案使允许参数对每个元素进行迭代,并使用 for-in 语法将每个值绑定到本地变量。...如果某个函数本身使用参数包从包形成元组值,则对该值调用协议要求将调用元组一致性见证或单个元素的见证,具体取决于包的大小。 标记元组和方差 元组标签不是参数包可以抽象的东西。...讨论无法从 Objective C 类调用 swift 扩展方法[8] 我为 ViewController 类创建了 swift 扩展,并在其中定义了一种方法。...Swift 语言底层原理剖析 - Array 系列-高阶函数[12] 摘要: 文章介绍了Swift的数组的 filter, forEach, map , compactMap, flatMap, reduce.../67148 [8] 无法从 Objective C 类调用 swift 扩展方法: https://forums.swift.org/t/unable-to-call-swift-extension-method-from-objective-c-class

16530

有效的只读属性

Objective-C 桥接 一些 API 设计人员可能希望通过将 Objective-C 方法导入作为属性来利用 Swift 的有效属性。...正常来说 Objective-C 方法导入作为 Swift 方法,所以把他们导入作为 Swift 有效属性将会通过 opt-in 注释进行控制。这避免了导入声明的任何源兼容性问题。...由于 Swift 有效属性只读特性限制,并且大部分 Objective-C 可失败的函数已经导入作为 Swiftthrows函数本提案Objective-C 桥接支持适用于 Swift 并发特性...本提案讨论 Objective-C 导入作为有效下标. 而且,将有效属性导出到 Objective-C 作为方法是以后的工作。...综上所述,如果 Objective-C 方法满足以下要求: 方法带一个参数,completion handler, 方法返回 void.

1.8K60
领券