文档章节

Swift Basic 3

Serysew
 Serysew
发布于 2014/09/06 11:07
字数 929
阅读 40
收藏 1

枚举类型和结构体

使用enum创建一个枚举类型

  1. 枚举类型的 Raw Value 是一个Int 类型

  2. 使用toRaw() & fromRaw(Int) 相互转换

enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
        switch self {
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queen"
        case .King:
            return "king"
        default:
            return String(self.toRaw())
        }
    }
}
let ace = Rank.Ace      //返回“ace”
let aceRawValue = ace.toRaw()   //返回 1
if let convertedRank = Rank.fromRaw(11) {
    let threeDescription = convertedRank.simpleDescription() //返回jack
}

使用Struct创建一个结构体

//来感受一下
//定义扑克牌数值A,2,3,4,5,6,7,8,9,10,J,Q,K

enum Rank: Int {
    case Ace = 1
    case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
    case Jack, Queen, King
    func simpleDescription() -> String {
        switch self {
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queen"
        case .King:
            return "king"
        default:
            return String(self.toRaw())
        }
    }
}
let ace = Rank.Ace
let aceRawValue = ace.toRaw()

//定义扑克牌花色
enum Suit {
    case Spades, Hearts, Diamonds, Clubs
    func simpleDescription() -> String {
        switch self {
        case .Spades:
            return "spades"
        case .Hearts:
            return "hearts"
        case .Diamonds:
            return "diamonds"
        case .Clubs:
            return "clubs"
        }
    }
}
let hearts = Suit.Hearts
let heartsDescription = hearts.simpleDescription()

//-------------------------------
//定义结构体扑克牌
struct Card {
    //属性1 数字
    var rank: Rank
    //属性2 花色
    var suit: Suit
    //方法1 输出扑克牌名称
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

协议和扩展

使用protocol申明一个协议

Classes, enumerations, structs 可以继承协议

使用extension向已存在的类型中添加属性和方法

//声明一个协议
protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}
//Classes, enumerations, and structs can all adopt protocols.
//声明一个类继承该协议
class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    //不需要关键字mutating,一个类随时可以更改它的方法
    func adjust() {
        simpleDescription += "  Now 100% adjusted."
    }
}
//-------------------------------------
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
//------------------------------------
//声明一个结构体继承该协议
struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    //关键字mutating修改结构体继承的方法
    mutating func adjust() {
        simpleDescription += " (adjusted)"
    }
}
//-------------------------------------
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
//-------------------------------------
//创建该协议的扩展
extension Int: ExampleProtocol {
    var simpleDescription: String {
        return "The number \(self)"
    }
    mutating func adjust() {
        self += 42
    }
}
//-------------------------------------
7.simpleDescription

//实例化一个protocol
let protocolValue: ExampleProtocol = a
protocolValue.simpleDescription

Generics

1.使用 Generics_Name<param> 创建一个Generics

Generics是程序设计语言的一种技术,指将程序中数据类型进行参数化,它本质上是对程序的数据类型进行一次抽象,扩展语言的表达能力,同时支持更大粒度的代码复用

对于一些数据类型参数化的类和方法来说,它们往往具有更好的可读性、可复用性和可靠性。在设计集合类和它们的抽象操作时,往往需要将它们定义为与具体数据类型无关,在这种情况下,使用Generics就是非常适合的。

如果需要设计一个TestGenerics类,有时需要元素为int类型的TestGenerics,有时可能需要元素为Boolean或者Object类型的TestGenerics。如果不使用Generics,我们通常需要定义不同的多个类,或者通过继承来实现。通过继承实现往往引起数据类型的转换问题。如果使用Generics技术,将TestGenerics的元素类型进行参数化,那么TestGenerics类的只需要实现一个版本,当需要某元素类型的Stack时,可以将类型作为参数来创建TestGenerics对象。

func repeat<ItemType>(item: ItemType, times: Int) -> [ItemType] {
    var result = [ItemType]()
    for i in 0..<times {
        result.append(item)
    }
    return result
}
repeat("knock", 4)       //["knock", "knock", "knock", "knock"]

2.可以用函数,枚举,结构体的形式使用Generics

enum OptionalValue<T> {
    case None
    case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None       //(Enum Value)
possibleInteger = .Some(100)                          //(Enum Value)

3.where用在参数后对参数进行约束

func anyCommonElements <T, U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, rhs: U) -> Bool {
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                return true
            }
        }
    }
    return false
}
anyCommonElements([1, 2, 3], [3])     //true
anyCommonElements([1, 2, 3], [4])     //flase








© 著作权归作者所有

上一篇: Linux Commands
下一篇: Swift Basic 2
Serysew

Serysew

粉丝 5
博文 39
码字总数 16555
作品 0
徐汇
程序员
私信 提问
2014年8月TIOBE编程语言排行榜单

八月头条: Swift 又掉出了前20 苹果公司新发布的Swift 在TIOBE 排名首次就排到了第16名。然后一番 炒作过后,Swift正在慢慢下滑。如果Swift在未来一段时间发展放缓的话,可以预见的是,Swift...

狂暴的大螃蟹
2014/08/12
14.8K
55
【读书笔记】The Swift Programming Language (Swift 4.0.3)

素材:Language Guide 初次接触 Swift,建议先看下 A Swift Tour ,否则思维转换会很费力,容易卡死或钻牛角尖。 同样是每一章只总结3个自己认为最重要的点。这样挺好!强迫你去思考去取舍。以...

ios122
2018/01/06
0
0
2015 年 6 月 RedMonk 编程语言排行榜

RedMonk 发布了 2015 年 6 月的编程语言排行榜,JavaScript 居榜首,Go,Swift 继续上升,函数式编程语言 Scala,Haskell 和 Clojure 上升明显。 现在已经是 2015 的第三个季度了,RedMonk 发...

oschina
2015/07/06
17.6K
68
[更新]Apple Swift学习资料汇总

今年的苹果开发者大会(WWDC)上,公布了ios8的几个新特性,其中包括引入了群聊功能,支持第三方输入法等功能。但更让开发者感兴趣的莫过于Swift语言的发布了。 Swift是apple自创的一门转为coc...

geeklxl
2014/06/05
5K
8
我们能从 RedMonk 和 TIOBE 排行榜中得到什么信息?

上周,TIOBE 发布了每月更新一次的编程语言排行榜,而久违的 RedMonk 也发布了 2018 年 Q1 编程语言排行榜。不妨看看通过这两份编程语言排行榜,我们能得到什么信息。 首先要说明的是,虽然 ...

周其
2018/03/12
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
今天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
今天
27
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
今天
61
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
今天
57
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
今天
59
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部