您的位置:首页 > 移动开发 > Swift

寒城攻略:Listo 教你 25 天学会 Swift 语言 - 02 Swift Tour

2014-07-16 08:48 387 查看
import Foundation

//***********************************************************************************************

//1.Hello world

//_______________________________________________________________________________________________

//输出 "Hello, world"

println("Hello, world") //使用 println
函数来输出字符串

//***********************************************************************************************

//2.Simple Values(简单值)

//_______________________________________________________________________________________________

//使用 let
命名常量,使用 var 命名变量
let myConstant =42
var myVariable =42

myVariable = 50

println("The constant is\(myConstant),the variable is\(myVariable)")

//_______________________________________________________________________________________________

//声明数据类型
let explicitDouble:Double =
70

println("The Double type number is\(explicitDouble)")

//_______________________________________________________________________________________________

//类型转化

let label =
"The width is "
let width =94

let widthLabel =
label + String(width) //不同类型数据进行基本运算的时候需要进行类型转化

println(widthLabel)

//_______________________________________________________________________________________________

//简单的字符串引用数据
let apples =3
let appleSummary ="I have
\(apples) apples"

println(appleSummary)

//_______________________________________________________________________________________________

//数组创建和使用

var shoppingList = ["water","bread",
"milk","paper",
"pen"]
println(shoppingList[2]) //获取数组中的第三个元素

//_______________________________________________________________________________________________

//字典的创建和使用

var occupations = ["Malcolm":"Captain",
"Kaylee":"Mechanic"]

occupations["Jayne"] ="Public relations" //给字典添加或者修改一个元素,系统检索字典
occupations是否包含 key
值 Jayne,如果有进行 key
对应的 value 值的修改,如果没有,进行新的 key和 value
的添加

println(occupations)

//_______________________________________________________________________________________________

//创建空的数组和字典
let emptyArray = [String]() //创建空的数组
let emptyDictionary =Dictionary<String,Float>()
//创建空的字典

//***********************************************************************************************

//3.Control Flow(控制流)

//_______________________________________________________________________________________________

//简单的控制语句
let individualScores = [75,43,
103, 87,
12]
var teamScore =0

for score inindividualScores{
if score >
50{ //if
语句之后必须为返回一个 Bool类型的数据
teamScore +=
3
}
else{
teamScore +=
1
}
}

println("The teamscore is\(teamScore)")

//_______________________________________________________________________________________________

//可选类型数据
var optionalString:String? =
"Hello"

optionalString ==
nil //设置 optionalString数据为可选类型数据,可选类型是指 optionalString有具体的值或者为空两种情况

var optionalName:String? =
"Joho Appleseed"
var greeting ="Hello"

if let name =optionalName{ //使用
if let 来判断可选类型数据是否有具体的值
greeting =
"Hello,\(name)"
}

println(greeting)

//_______________________________________________________________________________________________

//switch 语句
let vegetable ="red pepper"
var vegetableComment:String

switch vegetable{ //使用 switch
语句,每一条 case
代表一条判断,符合条件则执行语句

case"celery":

vegetableComment ="Add some raisins and make ants on a log."

case"cucumber","watercress":

vegetableComment ="That would make a good tea sandwich."

caselet x
where x.hasSuffix("pepper"): //使用
"x.hasSuffix("***")"函数来判断 x
变量末尾是否为 ***

vegetableComment ="Is it a spicy
\(x)?"

default:

vegetableComment ="Everything tastes good in soup."
}

println(vegetableComment)

//_______________________________________________________________________________________________

//使用 for in
let interestingNumbers = ["Prime": [2,3,
5, 7,
11, 13],"Fibonacci": [1,1,
2, 3,
5, 8],"Square": [1,4,
9, 16,
25],]
var largest =0
for (kind, numbers)in
interestingNumbers{
for number
in numbers{
if number >
largest{
largest = number
}
}
}

println("The largest number is\(largest)")

//_______________________________________________________________________________________________

//使用 while
/do while 语句
var n =2
whilen <
100{
n =
n * 2
}

println("the n is\(n)")

var m =2

do{
m =
m * 2
}while
m < 100

println("the m is\(m)")

//_______________________________________________________________________________________________

//范围运算符
var firstForLoop =0
for iin
0..<4{ //使用 "..<"表示前闭后开范围

firstForLoop += i
}

println("firstForLoop is\(firstForLoop)")

var secondForLoop =0
forvar i =
0; i <4; ++i{
//使用一般方法进行运算

secondForLoop += i
}

println("secondForLoop is\(secondForLoop)")

var thirdForLoop =0
for iin
0...4{ //使用 "..."表示前闭后闭范围

thirdForLoop += i
}

println("thirdForLoop is\(thirdForLoop)")

//***********************************************************************************************

//4.Function and Closures(函数和闭包)

//_______________________________________________________________________________________________

//函数的创建和使用

func greet(name:
String, day:
String) ->
String{
//使用 "func
函数名(参数) ->
返回值类型{ return *** }" 来创建一个函数

return"Hello
\(name), today is
\(day)"
}

println(greet("Bob","Tusday"))

//_______________________________________________________________________________________________

//无参数的函数
func getGasPrices() -> (Double,Double,
Double){ //函数参数为空

return (3.59,3.69,
3.79)
}

println(getGasPrices())

//_______________________________________________________________________________________________

//不确定参数的函数
func sumOf(numbers:Int...) ->
Int{ //当函数参数不确定数量的时候,使用 "..."即可
var sum =
0
for number
in numbers{
sum += number
}
return sum
}

println(sumOf(234,34,12))

//_______________________________________________________________________________________________

//函数嵌套
func returnFifteen() ->Int{
var y =
10
func add(){
y +=5
}
add()
return y
}

println(returnFifteen())

//_______________________________________________________________________________________________

//函数作为返回值
func makeIncrementer() -> (Int ->Int){
//定义返回值为函数类型的函数 makeIncrementer
func addOne(number:
Int) -> Int{
return
1 + number
}

return
addOne
}
var increment =makeIncrementer()

println(increment(7))

//_______________________________________________________________________________________________

//函数做参数
func hasAnyMatches(list: [Int], condition:Int ->Bool)
-> Bool{ //设置参数为整型数组和函数类型的函数 hasAnyMatches
for item
in list{
if condition(item){
return
true
}
}

return
false
}
func lessThanTen(number:Int) ->
Bool{ //定义函数符合 hasAnyMatches的参数类型
return number <
10
}
var numbers = [20,19,
7, 12]

println(hasAnyMatches(numbers,lessThanTen))

//_______________________________________________________________________________________________

//闭包
var numberArray = [3,45,
23, 523,
2]

let number =numberArray.map({
//Swift 中的 Array中有一个 map
方法,其获取的一个闭包表达式作为其唯一参数,数组中的每一个元素调用次该闭包函数,并返回该元素所映射的值,具体的映射方式和返回值类型由闭包来指定
(number:Int) -> Int
in
let result =
3 * number
return result
})

println(number)

//***********************************************************************************************

//5.Objects and Classes(对象和类)

//_______________________________________________________________________________________________

//类的创建

class Shape{ //使用 class声明一个类,类中的属性声明和声明常量变量一样,方法和函数声明是相同的方式
var numberOfSides =
0
func simpleDescription() ->
String{

return"A shape with
\(numberOfSides) sides."
}
}

//_______________________________________________________________________________________________

//使用类

var shape =
Shape()
//实例化一个类,注意类名首字母大写

shape.numberOfSides =7
//设置类的属性
var shapeDescription =shape.simpleDescription() //访问类的方法

println(shapeDescription)

//_______________________________________________________________________________________________

//使用 init
创建一个类的初始化器
class NamedShape{
var numberOfSides:
Int = 0
var name:
String

init(name:
String){

self.name = name //self
用来区分属性和参数,在初始化这个类时,每个初始值必须设置
}

func simpleDescription() ->
String{

return"\(name) find A shape with\(numberOfSides)
sides."
}
}

var name =
NamedShape(name:
"Listo")
//实例化并且初始化类 NameShape

name.numberOfSides =7
var nameDescription =name.simpleDescription()

println(nameDescription)

//_______________________________________________________________________________________________

//继承和覆写
class Square:NamedShape{
var sideLength:
Double

init(sideLength:
Double, name:String){
self.sideLength = sideLength
super.init(name: name)

numberOfSides =4
}

func area() ->
Double{

returnsideLength *
sideLength
}

override
func simpleDescription() ->String {
//使用 override来覆写父类中的方法

return"A square with sides of length
\(sideLength)"
}
}
let test =Square(sideLength:
5.2, name: "my test square")

println(test.area())

println(test.simpleDescription())

//_______________________________________________________________________________________________

//除了简单的存储属性,属性可以有一个 getter和 setter
class EquilateralTriangle:NamedShape{
var sideLength:
Double =0.0

init(sideLength:
Double, name:String){
self.sideLength = sideLength
super.init(name: name)

numberOfSides =3
}

var perimeter:
Double{
get{
return
3.0 *sideLength
//get 为获取这个属性的值
}
set{
sideLength = newValue /
3.0 //newValue
代表 set给这个属性的新的值
}
}

override
func simpleDescription() ->String {

return"An equilateral triangle with side of length
\(sideLength)"
}
}
var triangle =EquilateralTriangle(sideLength:
3.1, name: "a triangle")

println(triangle.perimeter)

triangle.perimeter =9.9

println(triangle.sideLength)

//_______________________________________________________________________________________________

//类中的方法和函数的区别
class Counter{
var count:
Int =0
func incrementBy(amount:
Int, numberOfTimes times:
Int){
count += amount * times
}
}
var counter =Counter()

counter.incrementBy(2,
numberOfTimes: 7) //类中的方法需要在调用的时候写出参数的形参名(第一个参数名不可以写),函数在调用的时候除了外部参数存在的情况,否则不能参数的形参名

//***********************************************************************************************

//6.Enumeration and Structures(枚举和结构体)

//_______________________________________________________________________________________________

//枚举的创建

enum Rank:
Int{
//使用 enum
创建一个枚举,注意枚举名用大写

case Ace =1
//指定第一个原始值为 1,后面的数据一次递增分配
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() ->
String{

switchself{ //这里的
self 就是一个枚举类型的值(enum value)
case .Ace:
return
"ace"
case .Jack:
return
"jack"
case .Queen:
return
"queen"
case .King:
return
"king"
default:

returnString(self.toRaw())
//使用 toRaw
和 fromRaw 来实现原始值和枚举值的转换
}
}
}
let ace =Rank.Ace

println(ace.simpleDescription())
let aceRawValue =ace.toRaw()

println(aceRawValue)

iflet convertedRank =
Rank.fromRaw(3){
let threeDescription = convertedRank.simpleDescription()
println(threeDescription)
}

//_______________________________________________________________________________________________

//枚举成员是实际的值,不是其原始值的另外一种表达方式
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 heartDescription =hearts.simpleDescription()

println(heartDescription)

//_______________________________________________________________________________________________

//结构体的创建(结构体和类之间最重要的一个区别是,结构体通过复制传递,类通过引用传递)

struct Card{ //创建结构体,结构体名大写
var rank:
Rank
var suit:
Suit
func simpleDescription() ->
String{

return"The
\(rank.simpleDescription()) of\(suit.simpleDescription())"
}
}
let threeOfSpades =Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription =threeOfSpades.simpleDescription()

println(threeOfSpadesDescription)

//_______________________________________________________________________________________________

//枚举的应用
enum ServerResponse{
case Result(String, String)
case Error(String)
}

let success =
ServerResponse.Result("6:00 am","8:09 pm")

let failure =
ServerResponse.Error("Out of cheese")

var serverResonse:String

switch success{
caselet .Result(sunrise, sunset):

serverResonse ="Sunrise is at
\(sunrise) and sunset is at\(sunset)"
caselet .Error(error):
serverResonse =
"Failure...\(error)"
}

println(serverResonse)

//***********************************************************************************************

//7.Protocols and Extensions(协议和扩展)

//_______________________________________________________________________________________________

//协议的创建

protocol ExamplePortocol{ //使用 protocol
创建协议,协议名要大写
var simpleDescription:
String { get}
mutating
func adjust()
}

//_______________________________________________________________________________________________

//类,枚举,结构体都可以写协议
class SimpleClass:ExamplePortocol{
//类遵守协议,必须实现协议中的方法
var simpleDescription:
String = "A very simple class."
var anotherProperty:
Int = 69105
func adjust(){
//在类中书写协议方法是不需要加上 mutating,因为一个类的方法可以修改类

simpleDescription +=" Now 100% adjusted."
}
}

var a = SimpleClass()

a.adjust()

let aDescription =a.simpleDescription

println(aDescription)

struct SimpleStructure:ExamplePortocol{
//结构体遵守协议,必须实现协议中的方法
var simpleDescription:
String = "A simple structure"
mutating
func adjust() { //在结构体中书写协议方法时要记得加上 mutating

simpleDescription +=" (adjusted)"
}
}

var b = SimpleStructure()

b.adjust()

println(b.simpleDescription)

//_______________________________________________________________________________________________

//使用 extension将扩展功能添加到现有的类型中
extensionInt:
ExamplePortocol{ //为协议添加功能
var simpleDescription:
String{

return"The number
\(self)"
}
mutating
func adjust(){
self +=
42
}
}

//_______________________________________________________________________________________________

//使用协议作为数据类型
let protocolValue:ExamplePortocol =
a

println(protocolValue.simpleDescription)

//***********************************************************************************************

//8.Generics(通用数据类型)

//_______________________________________________________________________________________________

//尖括号内写一个名字做一个通用的函数或类型
func repeat<ItemType>(item:ItemType, times:
Int) -> [ItemType] { //做通用的类型
var result = [ItemType]()
for i
in 0..<times{
result += item
}
return result
}

println(repeat("Knock",4))

//_______________________________________________________________________________________________

//你可以通用形式的函数和方法,以及类、枚举、结构
enum OptionalValue<T>{
case None
case some(T)
}
var possibleInteger:OptionalValue<Int> = .None

possibleInteger = .some(100)

println(possibleInteger)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐