• 有段oc代码如下: typedef void(^RootViewMoveBlock)(UIView *rootView,CGRect orginFrame,CGFloat xoffset); @property (copy,nonatomic) RootViewMoveBlock rootViewMoveBlock;//可在此block中重做动画效果 - ...
  • 1、我们先创建一个OC的项目MyFirstOCUseSwiftDemo 2、我们点击Target看到右边选择Build Settings,把Defines Module改为YES, 3、我们回到工程目录下,New File一个Swift File,起名为MyFristSwift,此时会...

    1、我们先创建一个OC的项目MyFirstOCUseSwiftDemo

    2、我们点击Target看到右边选择Build Settings,把Defines Module改为YES,

    3、我们回到工程目录下,New File一个Swift File,起名为MyFristSwift,此时会弹框提示我们是否创建一个桥接文件,如图:

    4、创建好之后我们再次选择项目的Target看到右侧的Build Settings选项,往下滑动会看到这样一个目录:

    此时是系统为我们自动创建了桥接"项目名-Swift"文件和"项目名-Bridging-Header"文件;

    5、接下来我们开始创建自己的Swift文件,新建一个Swift起名为:MyFristSwift,它看起来应该长这样:

    import Foundation
    import UIKit
    
    
    class MyFristSwift: UIViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
         
            self.view.backgroundColor = UIColor.green
    
        }
        
        
        
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }

    6、接下来我们要在OC的控制器(也就是你想要调用Swift的OC控制器)里边import一下第四步图中展示的swift文件,此时注意的是这个头文件是手动写的,你也可以在第四步中复制Objcective-C Generated Interface Header Name对应的值;

    7、好了,这是最后一步,在OC控制器中 创建一个按钮进入我们的swift页面吧,它应该是这样的:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        //创建属于我们自己的按钮
        [self.view addSubview:self.nextBtn];
    
    }
    - (void)nextBtnClicked:(UIButton *)btn{
        // 使用Swift的类
        MyFristSwift *swiftVC = [[MyFristSwift alloc] init];
        [self presentViewController:swiftVC animated:YES completion:nil];
    }
    -(UIButton *)nextBtn{
        
        if (!_nextBtn) {
            
            _nextBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            _nextBtn.frame = CGRectMake(40, 100, 100, 44);
            _nextBtn.layer.masksToBounds = YES;
            _nextBtn.layer.cornerRadius = 4;
            _nextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
            [_nextBtn setTitle:@"进入Swift" forState:UIControlStateNormal];
            [_nextBtn setBackgroundColor:[UIColor brownColor]];
            [_nextBtn addTarget:self action:@selector(nextBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
        }
        return _nextBtn;
    }
    

     

    展开全文
  • 1. swift调用oc,在swift项目内新建或者拖入oc文件,Xcode会提示添加header引用,点击允许即可,手动档寻百度 将需要暴露给swift调用的类导入该header.h中,即可在swift类中调用,swift一个项目就是一个命名空间,...

     

    1. swift调用oc,在swift项目内新建或者拖入oc文件,Xcode会提示添加header引用,点击允许即可,手动档寻百度

    将需要暴露给swift调用的类导入该header.h中,即可在swift类中调用,swift一个项目就是一个命名空间,不需要引入oc头文件

     

    2.oc调用swift,百度很久发现都要修改配置,亲测然并卵。

    oc调用swift方式,同上swift有命名空间概念,因此在oc需要引用swift的类中,导入“xxx-Swift.h”头文件即可,xxx就是你的项目名称。可能没有编译提示

    到此还不能调用,需要在被调用的swift方法或属性前添加 @objc 关键字,暴露给oc调用,此时该方法在oc才能得到编译器通过

     

    记录一下,swift 小坑整理

    转载于:https://www.cnblogs.com/pruple/p/8652051.html

    展开全文
  • OC工程调用Swift方法

    2017-01-11 11:45:08
    1.建一个OC工程命名为SwiftOC 2.新建一个swfit文件命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立“工程名-Bridging-Header.h” 3.配置工程 设置Defines Module 为Yes ...

    为防止出问题,建议以这样的方法做:
    1.建一个OC工程命名为SwiftOC
    这里写图片描述
    2.新建一个swfit文件命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立“工程名-Bridging-Header.h”
    这里写图片描述

    这里写图片描述
    3.配置工程
    设置Defines Module 为Yes
    这里写图片描述
    设置Product Module Name 为当前工程名
    这里写图片描述

    此时系统会为工程创建一个“上面所填Product Module Name-Swift.h”的文件,此文件不可手动创建,必须使用系统创建的

    4.创建一个Test2.swift
    这里写图片描述

    import Foundation
    public class HH:NSObject
    {
    
        public func show()
        {
         print("hello")
        }
    }

    5.在OC文件中引用swift

    
    #import "ViewController.h"
    //导入时需要手动打上,系统没有提示
    #import "SwiftOC-Swift.h"
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        HH *VC=[[HH alloc]init];
        [VC show];
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    展开全文
  • iOS SQLite.swift 使用

    2019-09-02 12:09:45
    iOS SQLite.swift 使用1. iOS SQLite.swift 简介2. iOS SQLite.swift 安装3. iOS SQLite.swift 使用3.1 导入3.2 创建/连接数据库3.3 Expression基本表达式3.4 创建表3.5 增,删,改,查3.5.1 插入操作(增)3.5.2 ...

    1. iOS SQLite.swift 简介

    • 之前使用SQLite苹果官方框架的痛点

    之前在Swift下使用SQLite很是麻烦(当然OC下也是挺麻烦的),苹果官方文档中,要使用原生的SQLite,要先导入framwork,然后建一个.h文件,还要做一次Swift与C语言的桥接(SQLite是基于C语言的),使用的时候还要写SQL语句,反正就是很麻烦,需要写很多胶水代码。

    • Swift下的SQLite.swift就是为了解决上面痛点而产生的。不过只支持swift4.0以上版本。

    2. iOS SQLite.swift 安装

    • 这里只介绍pod安装:
    pod 'SQLite.swift', '~> 0.11.4'
    

    3. iOS SQLite.swift 使用

    3.1 导入

    • 在要使用SQLite的地方导入头文件,当然一般会将数据库操作封装到一个类中import SQLite

    3.2 创建/连接数据库

    • 比如在iOS下,要在Document文件夹下创建一个名为db.sqlite3的数据库,并且要连接数据库。
    //获取doc路径
    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    //如果不存在的话,创建一个名为db.sqlite3的数据库,并且连接数据库
    let db = try Connection("\(path)/db.sqlite3")
    
    • 如果你把一个数据库应用程序(例如,复制数据库文件到你的Xcode项目并将其添加到你的应用程序的target),你可以建立一个只读连接。
    let path = Bundle.main.pathForResource("db", ofType: "sqlite3")
    let db = try Connection(path, readonly: true)
    
    • 如果省略路径,sqlite.swift将提供一个内存数据库。
    //创建一个内存数据库
    let db = try Connection() 
    
    • 有时候多个数据库连接使用同一个数据库的时候,可能会出现线程安全的问题,这时候访问数据库可能会出错,这时候就有类似于网络访问超时的机制,如果为单个数据库维护多个连接,可以设置超时时间(以秒为单位)以及繁忙处理程序。
    db.busyTimeout = 5
    
    db.busyHandler({ tries in
        if tries >= 3 {
            return false
        }
        return true
    })
    

    3.3 Expression基本表达式

    • Swift和SQLite数据类型的对照图

    Swift和SQLite数据类型的对照图

    • 表达式是与类型(内置或自定义)、原始SQL和(可选)值绑定到该SQL的通用结构。通常,您只需显式地创建表达式来描述列,通常每列只有一次。
    let id = Expression<Int64>("id")
    let email = Expression<String>("email")
    let balance = Expression<Double>("balance")
    let verified = Expression<Bool>("verified")
    
    • 以上表达式分别表示表的字段,第一个字段名是id,类型是Int64,第二个字段名是email,类型是String…以此类推,以上创建的是不为空的,要创建可以为空的字段,可以这样创建:let name = Expression<String?>("name")

    3.4 创建表

    • 声明一个Table常量
    let users = Table("users")
    
    • 使用上文表达式创建的字段,如果表不存在,就创建表
    try db.run(users.create(ifNotExists: true) { t in     // CREATE TABLE "users" (
        t.column(id, primaryKey: true) //     "id" INTEGER PRIMARY KEY NOT NULL,
        t.column(email, unique: true)  //     "email" TEXT UNIQUE NOT NULL,
        t.column(name)                 //     "name" TEXT
    }) 
    
    • 我们也可以对字段进行约束。设置字段为主键/自增/唯一/检查/设置默认值/校对/设置外键等等
    t.column(id, primaryKey: true)
    // "id" INTEGER PRIMARY KEY NOT NULL
    
    t.column(id, primaryKey: .autoincrement)
    // "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL
    
    t.column(email, unique: true)
    // "email" TEXT UNIQUE NOT NULL
    
    t.column(email, check: email.like("%@%"))
    // "email" TEXT NOT NULL CHECK ("email" LIKE '%@%')
    
    t.column(name, defaultValue: "Anonymous")
    // "name" TEXT DEFAULT 'Anonymous'
    
    t.column(email, collate: .nocase)
    // "email" TEXT NOT NULL COLLATE "NOCASE"
    t.column(name, collate: .rtrim)
    // "name" TEXT COLLATE "RTRIM"
    
    t.column(user_id, references: users, id)
    // "user_id" INTEGER REFERENCES "users" ("id")
    
    • 表之间的约束
    //不像上面的字段约束,它支持所有的数据库类型,升序和降序命令,和复合(多字段)键。
     t.primaryKey(email.asc, name)
    // PRIMARY KEY("email" ASC, "name")
    
    //不像上面的字段约束,它支持复合(多字段)键。
    t.unique(local, domain)
    // UNIQUE("local", "domain")
    
    t.check(balance >= 0)
    // CHECK ("balance" >= 0.0)
    
    //可以使用过滤器运算符和函数轻松地构造布尔表达式。
    t.check(balance >= 0)
    // CHECK ("balance" >= 0.0)
    
    //和上面的引用约束不同的是,它支持SQLite的全部类型,比如更新、删除操作以及复合(多字段)键。
    t.foreignKey(user_id, references: users, id, delete: .setNull)
    // FOREIGN KEY("user_id") REFERENCES "users"("id") ON DELETE SET NULL
    

    3.5 增,删,改,查

    3.5.1 插入操作(增)

    • 通过insert()方法进行插入操作,操作成功会返回一个类型为Int64的ROWID
    try db.run(users.insert(email <- "alice@mac.com", name <- "Alice"))
    // INSERT INTO "users" ("email", "name") VALUES ('alice@mac.com', 'Alice')
    
    try db.run(users.insert(or: .replace, email <- "alice@mac.com", name <- "Alice B."))
    // INSERT OR REPLACE INTO "users" ("email", "name") VALUES ('alice@mac.com', 'Alice B.')
    
    do {
        let rowid = try db.run(users.insert(email <- "alice@mac.com"))
        print("inserted id: \(rowid)")
    } catch {
        print("insertion failed: \(error)")
    }
    
    • 如果insert()方法没有任何参数,全部字段都会以默认值录入数据库表,字段没有默认值的,会报错。

    3.5.2 删除操作(删)

    • 使用delete()方法进行删除操作:
    try db.run(users.delete())
    // DELETE FROM "users"
    
    • 可以先使用filter()方法进行过滤操作,指定范围进行删除操作
    let alice = users.filter(id == 1)
    try db.run(alice.delete())
    // DELETE FROM "users" WHERE ("id" = 1)    
    
    • 删除操作会返回被删除数据的行号
    do {
        if try db.run(alice.delete()) > 0 {
            print("deleted alice")
        } else {
           print("alice not found")
        }
    } catch {
        print("delete failed: \(error)")
    }
    

    3.5.3 更新操作(改)

    • 赋值方法:

    在SQLite.swift中,可以直接使用 ‘<-’ 为字段赋值,由上文表达式一节可见端倪,同样,我们也可以在update,delete等语句中使用同样格式进行操作。比如,在更新语句中:try db.run(users.update(balance-=10)) 这条语句是指对表中全部数据的balance字段进行 -10 操作。

    • 使用update()方法进行更新操作:
    try db.run(users.update(email <- "alice@me.com"))
    // UPDATE "users" SET "email" = 'alice@me.com'    
    
    • 可以先使用filter()方法进行过滤操作,指定范围进行更新操作
    let alice = users.filter(id == 1)
    try db.run(alice.update(email <- "alice@me.com"))
    // UPDATE "users" SET "email" = 'alice@me.com' WHERE ("id" = 1)
    
    • 更新操作会返回被更新数据的行号
    do {
        if try db.run(alice.update(email <- "alice@me.com")) > 0 {
            print("updated alice")
        } else {
            print("alice not found")
        }    
    } catch {
        print("update failed: \(error)")
    }
    

    3.5.4 查询操作(查)

    • 在SQLite.swift中,使用prepare()方法表示SELECT操作。此方法返回的是一组数据,我们可以使用forin循环从里面取出数据.
    for user in try db.prepare(users) {
        print("id: \(user[id]), email: \(user[email]), name: \(user[name])")
    }
    // SELECT * FROM "users"
    
    • 在一条数据中的列下标将尝试中止错误的情况下执行,如果想处理这种情况,可以使用Row.get(_ column: Expression)
    for user in try db.prepare(users) {
        do {
            print("name: \(try user.get(name))")
        } catch {
            // handle
        }
    }    
    
    • 我们可以通过对数据库连接上的pluck方法的查询来获取第一行。
    if let user = try db.pluck(users) { /* ... */ } // Row
    // SELECT * FROM "users" LIMIT 1
    
    • 将查询结果封装成一个数组也很简单,我们可以这样处理:
    let all = Array(try db.prepare(users))
    // SELECT * FROM "users"
    
    • 上面的是指一些很简单的查询操作,实际操作中这些肯定满足不了我们的需求的,所以要用到复合查询操作。
    let query = users.select(email)           // SELECT "email" FROM "users"
                     .filter(name != nil)                // WHERE "name" IS NOT NULL
                     .order(email.desc, name)   // ORDER BY "email" DESC, "name"
                     .limit(5, offset: 1)                 // LIMIT 5 OFFSET 1
    
    • 选择指定的字段
    for user in try db.prepare(users.select(id, email)) {
       print("id: \(user[id]), email: \(user[email])")
        // id: 1, email: alice@mac.com
    }
    // SELECT "id", "email" FROM "users"
    
    • 数据表内联接,比如将posts表的user_id和users表的id作为连接条件,内联两个表
    users.join(posts, on: user_id == users[id])
    // SELECT * FROM "users" INNER JOIN "posts" ON ("user_id" = "users"."id")
    
    • 以上是表之间的连接,有时候涉及到表内自联,这时候就要用到数据表别名alias
    let managers = users.alias("managers")
    let query = users.join(managers, on: managers[id] == users[managerId])
    // SELECT * FROM "users"
    // INNER JOIN ("users") AS "managers" ON ("managers"."id" = "users"."manager_id")
    
    • 选择的条件:
    users.filter(id == 1)
    // SELECT * FROM "users" WHERE ("id" = 1)
    
    users.filter([1, 2, 3, 4, 5].contains(id))
    // SELECT * FROM "users" WHERE ("id" IN (1, 2, 3, 4, 5))
    
    users.filter(email.like("%@mac.com"))
    // SELECT * FROM "users" WHERE ("email" LIKE '%@mac.com')
    
    users.filter(verified && name.lowercaseString == "alice")
    // SELECT * FROM "users" WHERE ("verified" AND (lower("name") == 'alice'))
    
    users.filter(verified || balance >= 10_000)
    // SELECT * FROM "users" WHERE ("verified" OR ("balance" >= 10000.0))
    
    • 排序操作(ASC:升序,DESC:降序),根据email和name字段排序
    users.order(email, name)
    // SELECT * FROM "users" ORDER BY "email", "name"
    
    • email字段降序,name字段升序
    users.order(email.desc, name.asc)
    // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC
    
    • 分页操作,取前面5条数据
    users.limit(5)
    // SELECT * FROM "users" LIMIT 5
    
    • 分页操作, 偏移量为5,取偏移量后面5条数据
    users.limit(5, offset: 5)
    // SELECT * FROM "users" LIMIT 5 OFFSET 5
    
    • 聚合操作
    let count = try db.scalar(users.count)
      // SELECT count(*) FROM "users"
    let count = try db.scalar(users.filter(name != nil).count)
    // SELECT count(*) FROM "users" WHERE "name" IS NOT NULL
    let count = try db.scalar(users.select(name.count)) // -> Int
    // SELECT count("name") FROM "users"
    let max = try db.scalar(users.select(id.max)) // -> Int64?
    // SELECT max("id") FROM "users"
    let min = try db.scalar(users.select(id.min)) // -> Int64?
    // SELECT min("id") FROM "users"
    let average = try db.scalar(users.select(balance.average)) // -> Double?
    // SELECT avg("balance") FROM "users"
    let sum = try db.scalar(users.select(balance.sum)) // -> Double?
    // SELECT sum("balance") FROM "users"
    let total = try db.scalar(users.select(balance.total)) // -> Double
    // SELECT total("balance") FROM "users"
    

    3.6 错误处理

    • 你可以匹配上选择性地抓住SQLite的错误错误。例如,专门处理约束错误
    do {
        try db.run(users.insert(email <- "alice@mac.com"))
        try db.run(users.insert(email <- "alice@mac.com"))
    } catch let Result.error(message, code, statement) where code == SQLITE_CONSTRAINT {
        print("constraint failed: \(message), in \(statement)")
    } catch let error {
        print("insertion failed: \(error)")
    }
    
    • Result.error类型包含描述错误的英语文本(信息),错误代码(参见SQLite结果代码列表详情),产生错误的语句的一个可选的引用。

    3.7

    3.8

    展开全文
  • OC和Swift之间的互调很简单,iOS8以后官方给出了这两种语言之间的桥接方案,简单说就是在Swift工程中,通过提示创建的Bridging头文件可以将OC文件和Swift文件衔接在一起,从而可以在OC文件中引用Swift类,或者在...

    OC和Swift之间的互调很简单,iOS8以后官方给出了这两种语言之间的桥接方案,简单说就是在Swift工程中,通过提示创建的Bridging头文件可以将OC文件和Swift文件衔接在一起,从而可以在OC文件中引用Swift类,或者在Swift文件中引用OC的类。应用较多的主要是在Swift中调用OC类,使得在最新的swift工程中仍然能够兼容使用以前的OC类库等。

    这里通过一个简单的例子展示在Swift工程中OC和Swift之间的互调:

    首先建立一个Swift工程,这里创建了一个Single View Application,工程名为SwiftBridge,并分别新建了一个新的名为SwiftClass的swift类文件和一个名为OCClass的OC类文件,创建第一个OC文件后会提示创建一个Bridging头文件,创建后就可以对两者进行桥接:

    SouthEast

    SouthEast

    这里我们在ViewController.swift中调用OCClass类,同时在OCClass类中调用SwiftClass.swift。其中在swift中引用OC类时要在Bridging头文件中引入OC类的头文件(swift文件中没有头文件及其引用),而在OC中引用swift类时直接引入“SwiftBridge-swift.h”即可,不需要在Bridging头文件设置,其中“SwiftBridge”为工程名,该文件是隐藏的,对工程中所有swift类文件进行了向OC语言的翻译,从而在OC文件中可以像调用其他OC文件一样调用工程中的swift类文件。

    1. 在SwiftClass.swift中定义一个实例方法和一个类方法:
    import UIKit
    
    class SwiftClass: NSObject {
        func SwiftInstanceMethod() -> Void {
            print("swift instance method!");
        }
        class func SwiftClassMethod() -> Void {
            print("swift class method!");
        }
    }
    1. 在OCClass类中调用SwiftClass:
    /* OCClass.h */
    #import <Foundation/Foundation.h>
    
    @interface OCClass : NSObject
    - (void)OCInstanceMethod;
    + (void)OCClassMethod;
    @end
    
    /* OCClass.m */
    #import "OCClass.h"
    #import "SwiftBridge-swift.h" /* 引入swift类头文件 */
    
    @implementation OCClass
    - (void)OCInstanceMethod {
        /* 调用swift实例方法 */
        SwiftClass *swiftc = [[SwiftClass alloc] init];
        [swiftc SwiftInstanceMethod];
        NSLog(@"oc instance method!");
    }
    + (void)OCClassMethod {
        /* 调用swift类方法 */
        [SwiftClass SwiftClassMethod];
        NSLog(@"oc class method!");
    }
    @end
    1. 在Bridging头文件引入OC类头文件供swift调用:
    /* SwiftBridge-swift.h */
    #import "OCClass.h"
    1. 在ViewController.swift中调用OCClass类:
    /* ViewController.swift */
    import UIKit
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let occ = OCClass()
            occ.ocInstanceMethod()
            OCClass.ocClassMethod()
        }
    }

    打印结果:

    swift instance method!
    2017-04-12 12:40:39.657 SwiftBridge[3773:5420107] oc instance method!
    swift class method!
    2017-04-12 12:40:39.657 SwiftBridge[3773:5420107] oc class method!

    另外类似的也可以实现swift和C语言之间的互调。

    展开全文
  • OC中需要用到Swift代码的文件中引入#import “XXX-Swift.h”,XXX是你的工程名称。 特别注意 1、被使用的Swift的类必须是至少继承自NSObject的,不然OC识别不了这个类。 2、Swift中的属性和方法,要加上@objc...
  • 因为腾讯sdk是oc版本的,如果是普通swift项目引用,直接创建桥接文件就可以,但是framework桥接文件是没有用的,以下文档就是解决这个问题:怎么在Swift 的Framework工程里面引用oc的framework一、创建自己的swift ...
  • 最近使用swift的时候引用OC文件,就给大家说一下我的个人经验,以供大家参考。 一、是直接将OC文件拉到Swift的工程中,然后Xcode会自动创建桥接头文件,这种就比较省事了,Xcode给你自动创建。 二、就是Xcode...
  • 在项目中右键添加一个swift文件,我添加的LearnSwift.swift添加后Xcode弹出‘是否配置oc桥接头文件’的提示,点确认,系统自动生成一个项目名-Bridging-Header.h的文件,我的是LearnSwift-Bridging-Header.h。...
  • 1. swiftoc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解。 2. 在swiftOC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部加上 @objc(代理...
  • 有时候 ,我们会涉及到双向混合编程,特别是OCswift的互相引用。   swift调用oc的方法: 1、桥接文件,一般是swift工程,在创建一个oc文件时,系统自动添加(不用改名,直接默认即可) 2、将需要引用...
  • 总结一下自己对OC中和Swift中循环引用的认识。 一.OC中的循环引用分为类中的循环引用和对象之间的循环引用。 1.类的循环引用 造成原因: 在两个类的.h文件中使用了#import "" 而造成两个类之间的循环引用 解决办法:在...
  • 最近在研究swift,就我看来,swift确实是比OC更优秀的语言,这可以体现在很多方面,网上已经对比的很透彻,就不一一赘述。 今天研究了一下如何在OC项目中使用swift文件,即OCswift的混编问题,发现在OC中要使用...
  • iOS oc 调用 swift

    2019-07-03 07:14:24
    项目名称 LiqunSwiftDemo-Swift.h #ProjectName#-Swift.h 固定的写法 swift 目的 是取代oc 但是 不会完全取代 只是前端的替换 LiqunSwiftDemo-Swift 点进去 可以看到 所有的swift代码 都产生了 对应的一个 oc的...
  • OC 调用 Swift 方法

    2018-09-06 11:47:34
    1.新建Swift文件之前做以下设置 2.创建Swift文件后,会提示创建桥接文件,点击创建 3.Swift 类 import Foundation class RealmManager: NSObject { override init() { super.init() } @objc func ...
  • OC中调用Swift代码方法

    2018-06-03 09:27:48
    最近在项目中使用到了Swift语言写的第三方的框架,所以在这里将OC中使用Swift的方法说明一下。1.首先要在Build Setting中进行相关配置2.在Podfile文件中要加上use_frameworks!为什么要加use_frameworks!呢?首先需要...
  • OC项目引入Swift方法 在OC项目中,有可能会遇到需要引入Swift写的第三方库,下面整理下OC项目如何使用Swift库 1.在已有的OC工程中新建一个Swift文件,命名为Test.swift,会弹出提示,选择Create Bridging Header建立...
  • 之前在开发是遇到了在OC文件中调用Swift对象的变量调用不到的问题,这里总结一下: 1.首先我们一个Swift项目TestProject。 2.建立一个Swift的文件继承自NSObject名字为SwiftFile.swift,并声明一个字符串变量...
  • OCSwift混编

    2019-07-09 08:37:37
    新建一个工程,language选择swift,新加一个名为“SwiftClass.swift”的swift文件,一个名为“OCClass”的OC的.h和.m文件因为OC文件必须导入头文件,而Swift默认的头文件格式为:"工程名-swift.h",它就是项目中所有的...
1 2 3 4 5 ... 20
收藏数 4,584
精华内容 1,833
热门标签