xcode调用swift函数
2017-11-22 19:10:00 weixin_33686714 阅读数 4

OC 导入或生成Swift 文件时

Xcode会自动为Project生成头文件以便在Objective-C中调用。

在Objective-C类中调用Swift,只需要#import "productModuleName-Swift.h"即可调用,Xcode提供的头文件以Swift代码的模块名加上-Swift.h为命名。

在这个头文件中,将包含Swift提供给Objective-C的所有接口、Appdelegate及自动生成的一些宏定义,如图1-5所示。注意productModuleName-Swift.h在Xcode中是无法搜索查看的,只能从import中点击进去查看。

4408004-533ad2da35f88834.png

关于Xcode相关的配置, 不醉就不多说了, 百度一下一大把, 主要阐述一下不醉混合开发期间遇到的问题:

1> swift API 在OC中调用死活调不到(气煞老夫也)

    稍微了解swift的乖乖们都知道, 她有很多特性是OC理解不了的, 例如元组, 还有天杀的可以直接加函数甚至元组的枚举. 系统自动生成的-Swift.h一下就懵逼了, 牛头不对马嘴, 从import中点击进去查看, 什么枚举属性, func函数 就算是public open也完全找不到, 压根给你忽略了!怎么办?怎么办?不要怕, 问题就是给人解决的, 不然它的存在就毫无意义

举个栗子:

不醉最近在研究高大上的ARKit, 奈何坑爹的官方给的demo都是Swift, 不醉不是没用过Swift, 奈何很早之前了, 近两年基本就着女王(女盆友, 哈哈)的美味吃到肚子里了,好吧! 是都忘光了!忘了怎么办? 去学!当然要学, BUT, 老板不给你那么多时间啊, 我们的项目要用OC开发的 ,官方的代码全部翻译成OC不太现实, 时间, 对, 没时间!那么问题的关键来了, 怎么办?机智的乖乖们可能想到了-Swift.h理解不了的东西我们换个她能理解的方式给她实现, 这么多废话, 看代码:

func worldPosition(fromScreenPosition position: CGPoint, objectPosition: float3?, infinitePlane: Bool = false) -> (position: float3, planeAnchor: ARPlaneAnchor?, isOnPlane: Bool)? {

    这里的代码就像她肚子里的虫, 乖乖们多少还是要能看懂点的!

}

(fromScreenPosition position: CGPoint, objectPosition: float3?, infinitePlane: Bool = false)这是让你传入个元组;

(position: float3, planeAnchor: ARPlaneAnchor?, isOnPlane: Bool)这是给你return个元组;

奈何OC读不懂这个, 那么问题来了, OC能读懂什么, 此处又要啰嗦了:

继承自NSObject的对象类如:ARPlaneAnchor, 两者都有的CGPoint及基础数据类型等等, float3她不懂, 那么组成float3的Float她是可以懂的, 要怎么做呢?堆料!就是在Swift文件里重写函数,直接上代码:

func worldPosition0(fromScreenPosition position:CGPoint) -> (ARPlaneAnchor?) {

    这里边你就依葫芦画瓢嘛! 传入的点position有了,返回的ARPlaneAnchor有了! 不能用元组, 你就传不了多个参数(其实是不醉不知道, 有知道的可以赐教), 剩下的objectPosition: float3?, infinitePlane: Bool = false,position: float3,isOnPlane: Bool 怎么办? 想不到了吧, 你一定想不到不醉会用这么笨的方法:定义属性!!!

var objectPositionX: Float = 0

var objectPositionY: Float = 0

var objectPositionZ: Float = 0

//这三个是拆分的objectPosition: float3,跟position: float3同用一组就行了, 我就是用来传值; 在OC中调用你自定义的下边的方法之前初始化对象给它们赋值

var objectPosition: float3?

if objectPositionY != 0 && objectPositionX != 0 && objectPositionZ != 0 {

objectPosition = float3(x: self.objectPositionX, y: self.objectPositionY, z: self.objectPositionZ)

}//写在这个函数里, 这样就得到了Swift想要的float3

var infinitePlane: Bool = false//也在OC中调用你自定义的下边的方法之前初始化对象给它赋值

var isOnPlane: Bool = false//在return之前给它赋值, 你就可以在OC里获取到她想要的isOnPlane的值

以上定义的属性不是放在这里, 放在你Swift文件她定义其他属性的地方就OK👌


画完这个函数预编译一下, 从import中点击进去-Swift.h查看, 没意外!就是它:

        - (ARPlaneAnchor * _Nullable)worldPosition0From:(CGPoint)position                     SWIFT_WARN_UNUSED_RESULT;//

}

那么OC文件里的代码就是:

需要的属性赋值和

你想要的ARPlaneAnchor = [self.SceneView worldPosition0From:screenCenter];

以及position: float3(此处用那组三个属性自己拼好就行了)

感觉有点绕, 废话太多!有什么不懂得可以直接问, 未能及时回复的还请见谅!

未完待续! 记得点赞哦!

2016-04-04 17:47:00 weixin_34417200 阅读数 12

1).函数的定义:

函数的定义语法:

func 函数名(参数名:参数类型,参数名:参数类型...) -> 函数返回值类型 {

        函数实现部分

}

func showInputName(name:String) -> String {

print(name)

return name

}

函数调用语法:

函数名(参数...)

showInputName("Mike")


2).函数可以有多个返回值:使用元组

func showInputName(name:String) -> (String , String) {

print(name)

return ("1" , "2")

}


3).使函数返回值带有参数名

func showInputName(name:String) -> (string1 : String , string2 : String) {

print(name)

return ("1" , "2")

}

let _ = showInputName("haha").string1


4).函数的内部参数和外部参数

//outName为外部参数 name为内部参数

func showInputName(outName name:String) {

  print(name)

}

showInputName(outName: "haha")


5).函数的默认参数

func showInputName(name name:String = "haha") {

print(name)

}

showInputName()  //带默认参数的函数 调用的时时候 如果想要使用默认参数 那么外部参数名也要一起省略


6).函数参数的常量、变量性和inout

函数变量默认是常量类型,如果需要在函数体内更改,可以在声明时候,设置为变量类型:

func showInputName(var name :String) {

let b = name

name = b

}

showInputName("hah")

但是!!!此修改只是表面上的修改,如果想要改变实参值,则需要使用inout关键字:

func showInputName(inout name :Int) {

name += 10

print(name)

}

var a = 10

showInputName(&a)

print(a)  //两个打印结果 均为20


7).变参函数

如果想要传入任意多个参数,可以使用:“ 类型...” 的形式来声明函数:

func showInputName(name : Int...) {

   for i in name {

      print(i)

  }

}

showInputName(1,2,3,4,5)     //注意:变参一定要放在函数参数中的最后一个位置


8).函数类型

函数类型是由函数的参数返回值共同决定的

func showInputName(name : Int) {

}

var _ : (Int) -> Void = showInputName

注:函数类型还可以作为函数返回值的类型

2016-12-14 14:38:40 sinat_20037505 阅读数 589

 /*

         函数的定义和调用

         

         在编程世界中和数学世界中 函数的概念是不一致的

         

         函数的概念:完成某个特定任务的代码块。给某个代码块取个合适的名字,称之为函数名。

         简单来讲,当函数需要被执行的时候,调用这个名字就可以了。

         

         函数的分类:(1)程序员自定义并实现的函数;

         2他人定义实现的函数

         

         swift 定义函数的语法

         

         func 函数名(参数名:参数类型, 参数名:参数类型...-> 函数返回值类型 {

         

            函数实现部分...

         

         }

         

         

         swift 函数调用语法:

         函数名(实际参数...

         

         */

        

        

        // 函数名 应尽量取的有意义,驼峰命名函数

        

        let array = [1, 2, 3, 4, 4, 6]

        

        showIntegerArray(array: array)




     /*

     func name(parameters) -> return type {

         function body

     }

     */

    

    func showIntegerArray(array:[Int]) -> Void {

    

        for a in array {

            print("\(a)")

        }

    }


2015-07-04 09:46:31 tubiebutu 阅读数 941

当你定义一个函数时,你可以定义一个或多个有名字和类型的值,作为函数的输入(称为参数,parameters),也可以定义某种类型的值作为函数执行结束的输出(称为返回类型)。

每个函数有个函数名,用来描述函数执行的任务。要使用一个函数时,你用函数名“调用”,并传给它匹配的输入值(称作实参,arguments)。一个函数的实参必须与函数参数表里参数的顺序一致。

在下面例子中的函数叫做"greetingForPerson",之所以叫这个名字是因为这个函数用一个人的名字当做输入,并返回给这个人的问候语。为了完成这个任务,你定义一个输入参数-一个叫做 personName 的 String 值,和一个包含给这个人问候语的 String 类型的返回值:

func sayHello(personName: String) -> String {
    let greeting = "Hello, " + personName + "!"
    return greeting
}

所有的这些信息汇总起来成为函数的定义,并以 func 作为前缀。指定函数返回类型时,用返回箭头 ->(一个连字符后跟一个右尖括号)后跟返回类型的名称的方式来表示。

该定义描述了函数做什么,它期望接收什么和执行结束时它返回的结果是什么。这样的定义使的函数可以在别的地方以一种清晰的方式被调用:

println(sayHello("Anna"))
// prints "Hello, Anna!"
println(sayHello("Brian"))
// prints "Hello, Brian!"

调用 sayHello 函数时,在圆括号中传给它一个 String 类型的实参。因为这个函数返回一个 String 类型的值,sayHello 可以被包含在 println 的调用中,用来输出这个函数的返回值,正如上面所示。

在 sayHello 的函数体中,先定义了一个新的名为 greeting 的 String 常量,同时赋值了给 personName 的一个简单问候消息。然后用 return 关键字把这个问候返回出去。一旦 return greeting 被调用,该函数结束它的执行并返回greeting 的当前值。

你可以用不同的输入值多次调用 sayHello。上面的例子展示的是用"Anna""Brian"调用的结果,该函数分别返回了不同的结果。

为了简化这个函数的定义,可以将问候消息的创建和返回写成一句:

func sayHelloAgain(personName: String) -> String {
    return "Hello again, " + personName + "!"
}
println(sayHelloAgain("Anna"))
// prints "Hello again, Anna!"
2017-05-02 09:10:00 weixin_33964094 阅读数 5

当你定义一个函数时,你能够定义一个或多个有名字和类型的值。作为函数的输入(称为參数。parameters)。也能够定义某种类型的值作为函数运行结束的输出(称为返回类型)。

每一个函数有个函数名,用来描写叙述函数运行的任务。要使用一个函数时。你用函数名“调用”,并传给它匹配的输入值(称作实參。arguments)。

一个函数的实參必须与函数參数表里參数的顺序一致。

在以下样例中的函数叫做"greetingForPerson",之所以叫这个名字是由于这个函数用一个人的名字当做输入,并返回给这个人的问候语。为了完毕这个任务,你定义一个输入參数-一个叫做 personName 的 String 值,和一个包括给这个人问候语的 String 类型的返回值:

func sayHello(personName: String) -> String {
    let greeting = "Hello, " + personName + "!"
    return greeting
}

全部的这些信息汇总起来成为函数的定义,并以 func 作为前缀。指定函数返回类型时,用返回箭头 ->(一个连字符后跟一个右尖括号)后跟返回类型的名称的方式来表示。

该定义描写叙述了函数做什么。它期望接收什么和运行结束时它返回的结果是什么。

这种定义使的函数能够在别的地方以一种清晰的方式被调用:

println(sayHello("Anna"))
// prints "Hello, Anna!"
println(sayHello("Brian"))
// prints "Hello, Brian!"

调用 sayHello 函数时。在圆括号里传给它一个 String 类型的实參。由于这个函数返回一个 String 类型的值。sayHello 能够被包括在 println 的调用中。用来输出这个函数的返回值,正如上面所看到的。

在 sayHello 的函数体中,先定义了一个新的名为 greeting 的 String 常量,同一时候赋值了给 personName 的一个简单问候消息。

然后用 return keyword把这个问候返回出去。一旦 return greeting 被调用,该函数结束它的运行并返回greeting 的当前值。

你能够用不同的输入值多次调用 sayHello。上面的样例展示的是用"Anna""Brian"调用的结果。该函数分别返回了不同的结果。

为了简化这个函数的定义。能够将问候消息的创建和返回写成一句:

func sayHelloAgain(personName: String) -> String {
    return "Hello again, " + personName + "!"
}
println(sayHelloAgain("Anna"))
// prints "Hello again, Anna!"
没有更多推荐了,返回首页