函数

看一个函数的例子:

func addNumbers( let a:Int,let b:Int)->Int{
    return a+b;
}

实现两个数相加。函数必须以func开头,后面是函数名,小括号里是参数,箭头后面是返回类型。Swift中没有int之类的基本类型了,连表示数字都用类:Int。因为参数没有在函数内改变值,所以参数定义成常量。不论是类的方法或全局函数,语法一样。不像ObjC那样,全局函数是C语法,类方法是ObjC语法。

这样调用它:

let r = addNumbers(3,b: 4)

可以看到从第二个参数开始,需要带参数名。

函数要通过return返回多个值在ObjC中是做不到的,当然你可以放到一个数组或字典中把这个数组或字典返回。返回后再取出来也比较麻烦。如果你写的函数是给别人用的话,还要注释说明白,里面的各项数据是如何排列的。但现在语法已经支持了:用元组!下面这个例子是取得两个数相除的商和余数:

func divNumbers(a:Int,b:Int)->(shang:Int,yu:Int){
    return (shang:a/b,yu:a%b)
}

箭头后是返回值类型,看起来像参数,实际上就是定一了一个元组类型。return时,定义了一个元组对象,填入了两个数据的值。调用此函数:

let ret = divNumbers(7,b: 3)
print(ret) print(ret.shang)

可变参数

函数也支持可变参数,以下是一个计算平均值的例子:

func average(numbers:Int...)->Float{
    var he=0
    for num in numbers {
        he += num
    }

    return Float(he)/Float(numbers.count)
}

可以看到可变参数在函数内实际上是一个数组。

嵌套定义

函数还可以嵌套定义,就是在一个函数体内定义另一个函数,并且内部的函数可以随意使用所在函数的临时变量,反过来就不行。如:

func test(){
    var a=0;
    //定义内部函数
    func add(){
        a+=100 //直接操作外部变量
    }
    //调用内部函数
    add()
    print(a)
}

函数做返回值

//返回值类型是一个函数,其参数是整型,返回是整型

func testReturn()->((Int)->Int){ //定义要返回的函数 func action(a:Int)->Int{
        return a*a
    }
    //返回这个函数对象
    return action
}
let retFunc = testReturn()
//定义返回的函数
let bb = retFunc(22)

这事并没有什么特殊的,在C语言时代就可以啊。

函数做参数

比如数组排序函数中,比较两个相邻元素的代码可以放到函数中,比较函数做为参数传入,例子:

//比较函数
func compare(arr:[Int],firstIndex:Int,secondindex:Int)->Bool{
    if(arr[firstIndex]>arr[secondindex]) {
        return true
    }
    return false
}
//冒泡排序
func sort(var arr:[Int],compareFunc:([Int],Int,Int)->Bool){ //请大家自行写出冒泡排序代码。。。 for(var i=arr.count-1;i>0;i--){ for(var j=0;j<i;j++){ //这里是比较的代码 if(compareFunc(arr,j,j+1)){ let tmp = arr[j] arr[j]=arr[j+1] arr[j+1]=tmp } } } } var arr = [100,33,22,4353,67,6865,43,454] sort(arr,compareFunc: compare)

闭包

闭包跟嵌套函数实质没区别,可以直接用所在函数体的变量,唯一的差别就是名字。用闭包实现比较函数:

sort(arr,compareFunc: {
    (arr:[Int],secondindex:Int)->Bool in
    if(arr[firstIndex]>arr[secondindex]) {
        return true
    }
    return false
})

闭包的写法可以更简:

sort(arr,compareFunc: {
    if($0[$1]>$0[$2]) {
        return true
    }
    return false
})

可以看到省掉了函数类型说明,参数直接用序号来操作。

上一篇:Swift快速入门之分支与循环

Swift快速入门之函数的更多相关文章

  1. 使用canvas实现黑客帝国数字雨效果

    这篇文章主要介绍了使用canvas实现黑客帝国数字雨效果,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧

  2. ios – 声明NSDictionary并在Swift中添加键值对?

    我一直在尝试使用类类型键和值来声明一个NSDictionary,如下所示:这里,“Category”和“SubCategory”是全局类.我知道我不能将类类型用于关键字段.但是,无论如何,我应该做到这一点.有没有办法做到这一点?如何声明专门的NSDictionary或类似的东西来做到这一点?

  3. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

    Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

  4. ios – 类型不符合协议

    我仍然无法理解Swift中泛型的一些微妙之处.我定义了以下类型:viewForValue现在我定义了以下功能.我希望T是一个符合协议SomeProtocol的UIView.但是,当我执行代码时,我收到以下编译错误:似乎在where子句中我不能指定不实现协议的类.这是为什么?

  5. ios – 将Swift项目转换为易于使用的Cocoapods框架

    编辑1:我更新了项目,因此它已经具有框架结构,我只需要弄清楚我将如何向开发人员提供对自定义部件的访问权限.编辑2:我得到了一个答案,但我认为这个问题可能很容易被误解.目标是使其行为和行为像UICollectionView(与委托,数据源,…

  6. ios – Swift可选项:语言问题,还是做错了什么?

    应该有可选的类型;type是但是,如果我这样做,它的工作原理:它似乎是基本的替代,但我可能会遗漏一些语言的细微差别.谁能对此有所了解?之后就像暧昧一样,更多,这是我的解决方案:这适用于所有非对象Swift对象,包括Swift字符串,数字等.感谢Viktor提醒我String不是Swift中的对象.如果您知道值的类型,您可以替换任何?使用适当的可选类型,如String?

  7. ios – Swift – 使用字典数组从字典访问数据时出错

    我有一个非常简单的例子,说明我想做什么基本上,我有一个字典,其值包含[String:String]字典数组.我把数据填入其中,但当我去访问数据时,我收到此错误:Cannotsubscriptavalueoftype‘[([String:String])]?’withanindexoftype‘Int’请让我知道我做错了什么.解决方法您的常量数组是可选的.订阅字典总是返回一个可选项.你必须打开它.更

  8. ios – 如何在Swift中解包数组元素? (即数组为数组)

    假设我有一个String数组,我想将它映射到一个Int数组我可以使用map功能:Numbers现在是一个Int?数组,但我想要一个Int数组.我知道我可以这样做:但这似乎并不是很迅速.从Int数组转换?对于ArrayofInt,需要使用相当多的样板函数来调用filter和map.有更快捷的方法吗?解决方法更新:Xcode7.2Swift2.1.1

  9. ios – Swift:按字母顺序排序数组

    这就是我所拥有的:我将零件字典声明为:这让我可以为每个键提供多个值.这是一个巨大的帮助.然后我就能够创建partsSectionTitles并对其进行排序:这很有效,因为我没有收到错误.解决方法一个很好的Quicksort函数来订购你的字符串数组怎么样?

  10. ios – Swift无法通过下标分配:下标仅获取

    我对Swift语法相当新,并且我的代码“无法通过下标分配:下标仅获取”,我收到此错误这是从行:friendDictionary[(friendUIDas?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部