Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别。通过这两天的学习,算是捡回了漏掉的知识。

在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明。

但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号“&”进行传递。

上面呢,主要是个人在学习过程中的一点概括性的东西。具体的内容,就直接看代码了,而且代码里的注释也是相当清晰地\(^o^)/~

 func sayHello(name:String)->String
        {
            return "Hello "+name+" !";
        }

        sayHello("wangyi")

        println(sayHello("wangyi"))

        //统计元音字母 和辅音字母的数量
        func count(string:String)->(vowels: Int,consonants:Int,others:Int){
            var vowels=0,consonants=0,others=0
            for character in string{

                switch String(character).lowercaseString{
                case "a","e","i","o","u":
                    vowels++
                case "b","c","d","f","g","h","j","k","l","m","n","p","q","r","s","t","v","w","x","y","z":
                    consonants++
                default:
                    others++
                }
            }

            return (vowels,consonants,others)
        }

        println(count("hello world"))

        let total=count("some arbitrary string ")
        println("\(total.vowels) .vowels \(total.consonants) .consonants \(total.others) others")

        //外部参数名称
        //添加外部形参名称后,在调用函数时,阅读起来不至于茫然,知道每个参数代表什么意思
        func someFunction(externalParameterName localParamerName :Int)
        {
            println("localParamerName:\(localParamerName)");
        }
        someFunction(externalParameterName:5)

        //外部形参速记
        //在形参前添加“#”,即可快速替代外部形参名称,系统会自动补充与本地形参名称相同的外部形参
        func constainsCharacter(#string: String,#characterToFind:Character)->Bool
        {
            var result=false
            for character in string {
                if character == characterToFind{
                    result = true
                }
                else{
                    result = false
                }
            }
            return result
        }

        let constainsAVee=constainsCharacter(string: "aardvark", characterToFind: "k")
        println("constainsAvee:\(constainsAVee)")

        //默认形参值
        func join(string s1:String, toString s2:String, withJoiner joiner:String=" ")->String
        {
            return s1+joiner+s2
        }

        join(string:"hello",toString:"world" ,withJoiner:"-")
        //当有默认形参值后,在函数调用过程中,如果不给默认形参值赋值,则使用默认形参值
        println(join(string: "hello", toString: "world"))

        //调用时,则显示实参所代表的值
        println(join(string: "hello", toString: "world", withJoiner: "--"))

        //有默认值的形参,系统会自动添加与本地形参名一样的外部形参名
        func joinWithOutExterenParamerter(s1:String,s2:String,joiner:String=" ")
        {
            //形参默认是常量let型,赋值会导致编译错误
//            s1="asdf"
            println("\(s1)+\(joiner)+\(s2)")
        }

        joinWithOutExterenParamerter("hello","world",joiner:"~~~~")

        //可变形参
        //传递至可变形参的值在函数主体内是以适当类型的数组存在的
        func arithmeticMean(numbers:Double...)->Double
        {
            var total:Double=0
            for number in numbers
            {
                total+=number
            }

            //在函数体内就作为名为 numbers 类型为 Double[]的常量数组
            return total/Double(numbers.count )
        }

        println( arithmeticMean(1,2,3,4,5))

        //常量形参和变量形参
        //形参默认是常量,在做域内修改的话,会导致错误
        //如果要对形参的值进行修改,可以将其声明为变量类型
        //变量形参是变量,并给函数一个可修改的形参值副本 并不会导致传递过来的形参值发生改变
        func alignRight(var string:String,count:Int ,pad:Character)->String
        {
            let amountToPad=count-countElements(string)

            for _ in 1...amountToPad{
                string=pad+string
            }

            println("string:\(string)")
            return string
        }

        let originalString = "hello"
        let paddedString=alignRight(originalString,10,"-")

        //形参的值不会改变 改变的只是副本
        println("originString:\(originalString)")
        println("paddedString:\(paddedString)")

        //in-out形参
        //改变形参后,想在函数调用后继续保持形参值得改变,在变量前添加in-out即可
        //实参必须为变量,因为常量和字面量不能修改
        //在进行参数传递过程中,需要在实参前添加“&”符号
        func swapTwoInts(inout a:Int,inout b:Int)
        {
            let temporaryA=a;
            a=b;
            b=temporaryA
        }

        var someInt=3,anotherInt=5
        swapTwoInts(&someInt, &anotherInt)
        println("someInt:\(someInt)  anotherInt:\(anotherInt)")

其实仔细阅读《The Swift Programming Language》一书的同学都知道,都是书上的例子,如果有那块看的还不是太清楚的话,可以继续探讨学习哦\(^o^)/~

令附上demo:http://download.csdn.net/detail/jidiao/7512153

Swift学习笔记(二)参数类型,布布扣,bubuko.com

时间: 06-18

Swift学习笔记(二)参数类型的相关文章

Swift学习笔记- 4.集合类型

数组 数组的简单语法 写数组应遵循 Array<SomeType> 这样的形式,也可以使用 [someType] 这样的简单语法.推荐使用更短的 数组构造语句 数组字面量: [value1, value2, value3] var shoppingList: [String] = ["Eggs", "Milk”] 由于类型推断机制,当我们用字面量构造只拥有相同类型数值的时候,我们不必把数组的类型定义写清楚.还可以这么写: var shoppingList = [&

swift 学习笔记:值类型and参考类型!

helloworld篇章 值: swift中类型分为两种:第一种是值类型,该类型的每个实例持有数据的副本,并且该副本对于每个实例来说是独一无二的一份,比如结构体(struct).枚举(enum).元组(tuple)都是值类型.第二种是参照类型,该类型的实例共享数据唯一的一份副本(在native层面说的话,就是该类型的每个实例都指向内存中的同一个地址),比如类(class)就是参照类型 如果你想创建一个新类型,那么你应该选择值类型还是参照类型呢?当你使用Cocoa框架时,很多API都是NSObje

Swift 学习笔记 enum 枚举类型

异端,异端啊,我感觉这是map吧? 1 enum ATMStatus { 2 case Success(Int) 3 case Error(String) 4 } 5 6 var balance = 200 7 8 func withdraw(amount: Int) -> ATMStatus { 9 if balance >= amount { 10 balance -= amount 11 return .Success(balance) 12 } else { 13 return .Er

Swift学习笔记十二:下标脚本(subscript)

下标脚本就是对一个东西通过索引,快速取值的一种语法,例如数组的a[0].这就是一个下标脚本.通过索引0来快速取值.在Swift中,我们可以对类(Class).结构体(structure)和枚举(enumeration)中自己定义下标脚本的语法 一.常规定义 class Student{ var scores:Int[] = Array(count:5,repeatedValue:0) subscript(index:Int) -> Int{ get{ return scores[index];

【Swift】学习笔记(二)——基本运算符

运算符是编程中用得最多的,其包括一元,二元和三元 三种运算符.swift也和其它编程语言一样基本就那些,下面总结一下,也有它特有的运算符,比如区间运算符 1.一元运算符 =   赋值运算符,用得最多的啦,其不带任何返回值 +  加法(数字相加,也可用于字符拼接var ss = "a"+"b") -   减法 *   乘法 /   除法 % 求余(负号忽略,浮点数也可以求余) >  大于 <  小于 2.二元运算符 ++  自增(就是i = i + i的缩

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

swift学习笔记(三)关于拷贝和引用

在swift提供的基本数据类型中,包括Int ,Float,Double,String,Enumeration,Structure,Dictionary都属于值拷贝类型. 闭包和函数同属引用类型 捕获则为拷贝.捕获即定义这些常量和变量的原作用域已不存在,闭包仍然可以在闭包函数体内引用和修改这些值 class属于引用类型. Array的情况稍微复杂一些,下面主要对集合类型进行分析: 一.关于Dictionary:无论何时将一个字典实例赋给一个常量,或者传递给一个函数方法时,在赋值或调用发生时,都会

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource