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

时间: 2024-10-13 22:32:42

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

C#学习笔记二: C#类型详解

前言 这次分享的主要内容有五个, 分别是值类型和引用类型, 装箱与拆箱,常量与变量,运算符重载,static字段和static构造函数. 后期的分享会针对于C#2.0 3.0 4.0 等新特性进行. 再会有三篇博客  这个系列的就会结束了. 也算是自己对园子中@Learning Hard出版的<<C#学习笔记>>的一个总结了. 博客内容基本上都是白天抽空在公司写好的了, 但是由于公司内部网络不能登录博客园所以只能够夜晚拿回来修改,  写的不好或者不对的地方也请各位大神指出. 在下感

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

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

Swift学习笔记二

Swift是苹果公司开发的一门新语言,它当然具备面向对象的许多特性,现在开始介绍Swift中类和对象的语法. 对象和类 用"class"加上类名字来创建一个类,属性声明和声明常量或者变量是一样的,只是它是在类里边声明的而已.方法和函数声明也是一样的: class Shape { var numberOfSides = 0 func simpleDescription() -> String { return "A shape with \(numberOfSides)

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

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

SQL学习笔记——关于参数类型的问题

在使用存储过程的时候碰到一个问题: 存储过程有一个int类型的参数,可传0,1,2在存储过程中筛选数据,如果传空值则不做筛选. 然而存储过程处理该参数时会把0当作空值来处理,达不到预期效果. 解决方法 :将int型参数换为varchar型参数则不会有此问题 问题示例: 1 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetUsers]') and OBJECTPROPERTY(id, N'IsProc

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学习笔记(二):属性、元组

一.属性的getter和setter //设置计算型属性:其并不真正的存储值,而是每次通过其他值计算得来 var subtotal: Double { //getter:通过total.taxPct计算获得total的值 get { return total / (taxPct + 1) } //setter:更新的是相关的值(比如此处基于newSubtotal来设置total.taxPct的值) set(newSubtotal) { //... } } 二.元组 | Tuples //创建一个

初探swift语言的学习笔记(可选类型?和隐式可选类型!)

可选类型.隐式可选类型 其次swift还引入一个较有趣的初始值设置语法使用"?"操作符及"!"号操作符 如:"var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = op