oc swift 枚举 调用

2015-08-20 10:14:42 sinat_30727837 阅读数 352

在Swift上调用OC封装好的一个model,里面有个枚举类型:

typedefenum {
    kCOManageCreater =1,           //创始人
    kCOManageManager,          //管理员
    kCOManageNormal,           //普通用户
}kCOManagerType;

然后再swift里面调用:

<pre name="code" class="objc">ifuserModel!.manageType==kCOManageManager {

}




结果提示  if userModel!.manageType== kCOManageManager 这语句错误,
错误信息为:
Cannot invoke '==' with an argument list of type '(kCOManageManager,kCOManageManager)' 

查了相关资料发现swift和OC混合编程枚举类型无法判断   

解决办法在枚举值后面加上.Value

ifuserModel!.manageType.value ==kCOManageManager.value






2019-02-25 20:35:07 wei78008023 阅读数 796

在OC和Swift混编的过程中有很多的细节需要注意。

今天介绍一下在OC文件中声明了一个枚举类型,如何在Swift文件中调用该枚举类型的值。

1.项目工程构建的时候选的是Swift语言,项目名称TestProject。

2.建立一个Swift文件SwiftTestFile.swift 和一个OC的文件 ObjectTestFile.h 和ObjectTestFile.m。

在ObjectTestFile.h 中声明一个枚举类型:

typedef NS_ENUM(NSInteger, YXLabelStyle) {
    YXLabelStyleSingle1_1,
    YXLabelStyleSingle1_2,
    YXLabelStyleSingle1_3,
}

首先必须确认的是枚举的每个值必须是枚举的“名字+后缀”的形式,这是一种规范,不这样在Swift文件中会导致调用不到。

也就是例子中枚举名为“YXLabelStyle”,那么每个值必须是“YXLabelStyle+...”的形式。

3.首先想要Swift调用OC文件及内容,必须有一个桥接文件并把需要调用的OC文件的头文件引入,桥接文件的构建就不多说了,一搜一大把,我们项目中桥接文件为“Bridging-Header.h”。

桥接文件中导入头文件:

#ifndef Bridging_Header_h
#define Bridging_Header_h

#import "ObjectTestFile.h"

#endif /* Bridging_Header_h */

4.这样就可以在Swift文件中调用这个枚举类型的值。

在调用的时候直接使用“YXLabelStyle.single1_1”或者直接“.single1_1”调用即可,这就是为什么要规范的原因。

5.列子:

假设我们有一个YXLabel,自定义实例化方法需要传入该枚举类型的值来确定YXLabel的一些样式和特性,那么我么可以这样:

let label = YXLabel(style: YXLabelStyle.single1_1)

或者直接这样:

let label = YXLabel(style: .single4_1)

 

2018-07-20 16:19:07 kaiyuanheshang 阅读数 4221

Swift 调用 OC

Swift 调用 OC 分为两种常见情况,一种是直接在 Application 的 project 中使用;另一种情况是,在 framework 开发中使用。

对于互相调用的原理,如下图所示,更详细的内容可以参考 《Using Swif with Cocoa and Objective-C》

这里写图片描述

图 一

其中最关键的就是三个文件 bridging header(app)、umbrella header(framework)、generated header(swift to OC)。所以主要工作就在于如何生成和指定这些文件。

Application

在一个 Swift 开发的工程中可以通过两种方法来生成桥接文件。

第一种是,直接拖拽 OC 文件到工程中,此时系统会询问是否生成桥接文件,如图:

这里写图片描述

选择 “Create Bridging Header” Xcode 就会自动生成桥接需要的文件和修改相关配置。

另外一种方式是自己指定。桥接文件的命名方式为:ProjectName-Bridging-Header.h,所以先按照这个格式生成一个头文件,然后在 “Build Settings” -> “Swift Compiler - General” -> “Objective-C Bridging Header” 处指定桥接头。

设置完成后,只要在桥接头中引用相应的 OC 文件就可以在工程中的 Swift 文件中使用对应的 OC 类和方法。

framework

framework 中不允许使用桥接头的方式(即不允许指定 “Objective-C Bridging Header” 的值)。在新建一个 framework 的 Project 时,会自动生成一个同名的头文件。比如新建一个工程为 DuAR 的fraework,会自动生成 DuAR.h 文件,这个文件就是 “umbrella header”,如果在这个工程中用到了 OC 源文件或者 OC 写的三方库,就可以在这里引入对应的头文件,从而实现工程中的 Swift 可以使用 OC 类和方法。

关于 “umbrella header” 还有一个叫 “umbrella framework” 的东西,可以实现 A framework 包含 B framework,但是这种方式不推荐使用。具体请搜索。

OC call Swift

在我们新建完一个 Swift 工程的时候,“Swift Compiler - General” 里会有一个叫做 “Objective-C Generated Interface Header Name” 的选项,这个选项里的值为 “ProjectName-Swift.h”,这个文件就是系统生成的 Swift 文件对应的 Objective-C 的头文件。

当在 OC 文件中调用 Swift 文件中的类的时候,首先在 OC 文件中引用上面提到的头文件,即 #import "ProjectName-Swift.h"。这个文件虽然在工程中看不到,但是她真实存在,编译后,你可以按住Command+单击该文件名,就会看到具体生成的代码。
引入后,具体类的使用,直接按照OC的方式使用即可。

这个方法适用于 Application 工程和 framework 工程。

注意事项

相比于 OC 的灵活和强大的运行时,Swift 强调更高的安全性。所以 Swift 的运行时很弱,强类型等特点使得未声明为支持 OC 的 Swift 类和方法是不能通过桥接的方式在 OC 文件中使用的。

如果需要一个 Swift 的类或方法在 OC中可以使用,则必须通过标记的形式告知编译器,即图一中的 @class,同时还有 @objc 等。或者这个类可以直接继承自 NSObject 或其子类,这样也能实现 Swift 类或方法在 OC 中被调用。

Swift 中有许多 OC 没有的特性。比如,Swift 有元组、特有的枚举等。这些特性也不能够在 OC 中使用。所以,要使用的混编文件要注意 Swift 独有属性问题。

2016-07-31 08:56:30 huangyongf 阅读数 2359

OC枚举和Swift 枚举


下面介绍一下 OC 枚举和 Swift 枚举的写法!

OC枚举:


         


Swift 枚举:

            


 以上,希望对大家会有所帮助,谢谢!










Swift 枚举(七)

阅读数 4222

swift enum 和OC兼容

阅读数 2529