iOS开发——swift篇&Swift新特性(二)函数、枚举、类与结构

函数、枚举、类与结构

可变参数

Swift的函数可以接受零个或多个指定类型的参数值,使用...来表示传递的是可变参数

func arithmeticMean(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
// returns 3.0, which is the arithmetic mean of these five numbers
arithmeticMean(3, 8, 19)
// returns 10.0, which is the arithmetic mean of these three numbers

枚举类型

和C语言中的枚举不同的是,Swift中的枚举类型没有为这一组相关名称指定一组整数值作为初始值。Swift中的枚举成员可以指定为任何类型,整数,字符或者浮点数。

enum CompassPoint {
    case North
    case South
    case East
    case West
}

上面的例子中的CompassPoint.North并不默认为0。

便捷性

一旦声明了一个枚举类型

var directionToHead = CompassPoint.West

在修改这个枚举值的时候就可以省略枚举类名了

directionToHead = .East

功能性

Swift中的枚举类型可以被声明为更高级的形式:

enum Barcode {
    case UPCA(Int, Int, Int)
    case QRCode(String)
}

这个Barcode枚举被定义为两种可能,UPC-A模式的条码,关联值了三个Int值;或者是二维码,关键一个String的值。

然后就可以方便地创建条码类型:

var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

然后在switch语句中使用:

switch productBarcode {
    case .UPCA(let numberSystem, let identifier, let check):
    println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
    case .QRCode(let productCode):
    println("QR code with value of \(productCode).")
}
// prints "QR code with value of ABCDEFGHIJKLMNOP."

类与结构

结构和枚举是数值类型

当赋值或者作为参数传递时,是完整地创建了一个副本,而不是使用的引用对象:

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
println("cinema is now \(cinema.width) pixels wide")
// prints "cinema is now 2048 pixels wide"
println("hd is still \(hd.width) pixels wide")
// prints "hd is still 1920 pixels wide"

类和结构是引用类型

当赋值或者作为参数传递时,传递的是引用对象。下面例子中VideoMode是一个类:

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0
let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
println("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// prints "The frameRate property of tenEighty is now 30.0"

判断引用是否相等,可以使用===!==

字典的赋值

字典赋值或者作为参数传递时,会被完整地复制,创建一个副本:

var ages = ["Peter": 23, "Wei": 35, "Anish": 65, "Katya": 19]
var copiedAges = ages
copiedAges["Peter"] = 24
println(ages["Peter"])
// prints "23"

数组的赋值

数组只有在进行了修改数组长度操作时,才会完整地复制,创建一个副本。其他时候使用的是引用:

var a = [1, 2, 3]
var b = a
var c = a
println(a[0])
// 1
println(b[0])
// 1
println(c[0])
// 1
a[0] = 42
println(a[0])
// 42
println(b[0])
// 42
println(c[0])
// 42
a.append(4)
a[0] = 777
//数组a添加了一个数字,改变了数组大小,所以数组a创建了一个副本
println(a[0])
// 777
println(b[0])
// 42
println(c[0])
// 42

可以使用unshare方法来使一个数组“独立”,成为一个新的“副本”

b.unshare()
b[0] = -105
println(a[0])
// 777
println(b[0])
// -105
println(c[0])
// 42

也可以使用copy方法来完成强制拷贝

var names = ["Mohsen", "Hilary", "Justyn", "Amy", "Rich", "Graham", "Vic"]
var copiedNames = names.copy()
copiedNames[0] = "Mo"
println(names[0])
// prints "Mohsen"
时间: 2024-08-04 19:13:08

iOS开发——swift篇&Swift新特性(二)函数、枚举、类与结构的相关文章

iOS开发项目篇—08新版本特性·SrollView

iOS开发项目篇—08新版本特性 一.简单说明 展示新版本的特性:第一次使用一些应用软件时,展示这个版本的软件的新特性,一般在第一次启动程序的时候显示. 1.什么情况下显示版本新特性: (1)第一次使用某个软件时(X) (2)第一次使用某个版本时,显示版本新特性(V) 2.怎么知道这个软件的版本呢? 在plist文件里,bundle version中显示版本号. 3.如何显示版本新特性? 应该在YYAppDelegate.m中进行判断: 如果是第一次使用这个版本,那么就显示版本新特性(设置为wi

iOS开发项目篇—09新版本特性·分享

iOS开发项目篇—09新版本特性·分享和开始 一.ios开发中图片的加载 图片的加载: [UIImage imageNamed:@"home"];  加载png图片 (一)非retina屏幕 (1)3.5 inch(320 x 480) * home.png (二)retina屏幕 (1)3.5 inch(640 x 960) * [email protected] (2)4.0 inch(640 x 1136) * [email protected](如果home是程序的启动图片,才

iOS开发实用技巧—项目新特性页面的处理

iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性界面的控制器,可以实用代码也可以用xib,在这里实用纯代码方式,创建一个控制器NewfeatureViewController. 头文件代码: 1 // 2 // JMNewfeatureViewController.h 3 // 4 5 #import <UIKit/UIKit.h> 6 7 t

iOS开发——语法篇&amp;swift经典语法总结

swift经典语法总结 1:函数 1.1 func funcNmae()->(){} 这样就定义了一个函数,它的参数为空,返回值为空,如果有参数和返回值直接写在两个括号里就可以了 1.2 参数需要指明类型,而如果没有返回值可以不写->(),返回值只需要写返回类型,如果写了返回名称,可以在函数调用后的值用点语法访问 1.3 在参数名称前可以加上外部参数名,调用的时候就可以带上它了,如果外部参数名和内部参数名相同则可以直接在内部参数名前加#即可 1.4 如果跟参数设置一个默认值,则swift会自动

iOS开发——面试篇&amp;面试总结(二)

面试总结(二) 1. 风格纠错题 修改方法有很多种,现给出一种做示例: 下面对具体修改的地方,分两部分做下介绍:硬伤部分和优化部分 .因为硬伤部分没什么技术含量,为了节省大家时间,放在后面讲,大神请直接看优化部分. 优化部分 1)enum建议使用 NS_ENUM 和 NS_OPTIONS 宏来定义枚举类型,参见官方的 Adopting Modern Objective-C 一文: 1 2 3 4 5 //定义一个枚举 typedef NS_ENUM(NSInteger, CYLSex) {   

iOS开发——OC篇&amp;常用问题解答(二)

101.编译错误:ld: library notfound for -lPods 当项目中使用了 cocoaPods 时,经常出现此错误(通常是 release 的时候). 这是由于 pod install 后,cocoaPods 会创建一个新的 workspace.你必须关闭项目并重新打开.问题即可解决. 102.为什么 iOS 的时间总是比真实时间慢8小时 例 如,一个北京时间"2014-4-4 22:00"(字符串),需要转换成 NSDate.字符串转换成 NSDate 一般是通

iOS开发——UI篇Swift篇&amp;玩转UItableView(二)高级功能

UItableView高级功能 1 class UITableViewControllerAF: UIViewController, UITableViewDataSource, UITableViewDelegate { 2 3 var titleString:String! 4 5 @IBOutlet var titleLabel:UILabel! 6 @IBOutlet var listTableView : UITableView! 7 @IBOutlet var editDoneBut

iOS开发——UI篇Swift篇&amp;玩转UItableView(四)自定义&amp;封装

UItableView自定义&封装 一:Model 1 class AppsModel: NSObject { 2 3 //定义模型的三个属性 4 var imageName:String! //图片名称 5 var appName:String! //应用名称 6 var appDescription:String! //应用描述 7 8 9 10 //自定义初始化方法 11 init(imageName image_Name:String , app_Name:String , app_De

iOS开发——动画篇Swift篇&amp;动画效果的实现

Swift - 动画效果的实现 在iOS中,实现动画有两种方法.一个是统一的animateWithDuration,另一个是组合出现的beginAnimations和commitAnimations.这三个方法都是类方法. 一,使用animateWithDuration来实现动画 (1)此方法共有5个参数: duration:动画从开始到结束的持续时间,单位是秒 delay:动画开始前等待的时间 options:动画执行的选项.里面可以设置动画的效果.可以使用UIViewAnimationOpt

iOS开发——UI篇Swift篇&amp;玩转UItableView(一)基本使用

UItableView基本使用 1 class ListViewController: UIViewController , UITableViewDataSource, UITableViewDelegate { 2 3 //定义listTableView 输出口 4 @IBOutlet var listTableView : UITableView! 5 6 //定义数组 7 var items:[String] = ["UITableView高级使用", 8 "自定义U