Swift初探

seqn0777 8年前發布 | 7K 次閱讀 Apple Swift開發

來自: http://my.oschina.net/xinxingegeya/blog/608514


?Swift初探

Xcode 7.2

下面swift一些基本的語法。把這些代碼寫下來,發現swift和一些語言很像,比如javascript和scala。如果對這些語言比較熟悉的話,一看代碼就會懂。

總的來說swift的語法還是比較fashion。好評~~~

//: Playground - noun: a place where people can play

import UIKit

var str = "Hello, playground"

let name = "hello world"

//編譯器會自動推斷類型,該類型是Int
let implicitInt = 70

//編譯器會自動推斷類型,該類型是double
let implicitDouble = 10.0

//定義一個常量,并指定類型為double
let explicitDouble: Double = 70

let height:Float = 5


let label = "the width is"

let width = 90

//值永遠不會被隱式轉換為其他類型,這里使用String 顯式轉換一個字符串
let widthLable = label + String(width)

print(widthLable)

let apples = 3

let oranges = 5


//  \(apples)是一種簡單的方式來轉換字符串
let appliSummary = "I have \(apples) apples;"

let fruitSummary = "I have \(apples + oranges) pieces of fruits;"


//創建一個數組
let shoplist = ["catfish","water","tulips","blue paint"];

//使用[String]表明是一種數組類型
var shoppingList: [String] = ["Eggs", "Milk"]

//使用下標來訪問數組元素
print(shoplist[1])

//創建一個空數組
let emptyArray = [];
print(emptyArray)

//創建一個空的數組
let emptyStringArray = [String]()
print(emptyStringArray)


let individualScores = [12,12,13,25]

var teamScore = 0

//swift中基本的for循環控制流
for score in individualScores {
    if score > 13{
        teamScore += 3
    } else{
        teamScore += 1
    }
}

print(teamScore)


//使用?表示該變量的值是可選的
var optionalString:String? = "hello"
optionalString = nil
var optionalName:String? = nil

var greeting = "Hello!"


//如果變量的可選值是 nil,條件會判斷為 false,大括號中的代碼會被跳過。如果不是nil,
//會將值賦給 let 后面的常量,這樣代碼塊中就可以使用這個值了。
if let name = optionalName {
    greeting = "Hello,\(name)"
} else {
    greeting = "Hello everyone"
}



//switch語法
let vegetable = "red pepper"

switch vegetable{
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber","watercress":
    let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"
default:
    let vegetableComment = "Everything tastes good in soup."
}

let vegetable2 = "watercress"


//switch必須有一個default
switch vegetable2{
case "celery":
    let vegetableComment = "Add some raisins and make ants on a log."
case "cucumber","watercress":
    let vegetableComment = "That would make a good tea sandwich."
case let x where x.hasSuffix("pepper"):
    let vegetableComment = "Is it a spicy \(x)?"
default:
    let vegetableComment = "Everything tastes good in soup."
}


//定義字典數組
let interestingNumbers = [
    "prime":[2,3,5,7],
    "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
        }
    }
}

print(largest)


//1...3 是 Closed Range Operator => 1 2 3
var sum = 0
for i in 1...3{
    sum += i
}
print(sum)

sum = 0

//1..<3 是 Half-Open Range Operator => 1 2
for i in 1..<3 {
    sum += i
}
print(sum)



//函數的定義
//使用右向箭頭表示返回值
func greet(name:String, day:String) ->String{
    return "Hello \(name),today is \(day)";
}

greet("LiYi", day: "2016-1-1")
greet("world",day: "2016-1-1")


//函數返回類型為元組
func getGasPrices() -> (Double,Double,Double){
    return (3.56,3.23,3.21)
}

getGasPrices()


//swift的可變參數列表
func sumOf(numbers:Int...)->Int{
    var sum = 0
    for number in numbers{
        sum += number
    }
    return sum
}
sumOf()
sumOf(42,597,12)


//在函數內部定義一個函數
func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    //調用函數內部的函數
    add()
    return y
}

returnFifteen()



//=========函數作為返回值

//定義一個函數,返回值是一個函數類型
//函數類型是 (Int -> Int) ,表示該函數接收一個入參Int,返回值是Int
func makeIncrementer() -> (Int -> Int){
    func addOne(number:Int)->Int{
        return 1 + number
    }
    return addOne
}

var increment = makeIncrementer()

increment(1)


//定義一個函數 makeAdd ,其返回值也是一個函數類型,
//(Int,Int) -> Int 表示返回類型,是一個接收兩個Int參數,返回Int的函數
func makeAdd()-> (Int,Int) -> Int {

    func add(a:Int ,b:Int) -> Int{
        return a + b
    }
    
    return add;
}

var  add = makeAdd()

add(1,2)


//=========函數作為參數
func hasAnyMatches(list:[Int],condition:Int -> Bool) -> Bool {
    for item in list{
        if condition(item){
            return true;
        }
    }
    return false
}

func lessThanTen(number:Int)->Bool{
    return number < 10
}


hasAnyMatches([20,19,7,12], condition: lessThanTen)


var numbers = [20,19,7,12]

//(number:Int) -> Int 是一個匿名閉包的入參和返回值
//使numbers數組中的元素都變成了三倍
numbers.map(
    {
        (number:Int) -> Int in
        let result = 3 * number
        return result
    }
)


//map 函數
numbers.map(
    {
        (number:Int) -> Int in
        if number % 2==0{
            let result = 3 * number
            return result
        } else {
            return 0
        }
    }
)

//filter 函數
numbers.filter({
    (number:Int) -> Bool in
    return number % 2 == 0
})



//類的定義
class Shape{
    //定義一個常量
    let happy = true
    //定義一個變量
    var numberOfSides = 0
    func simpleDscription() -> String{
        return "A shape with \(numberOfSides) sides"
    }
    
    func toHappy()->Bool{
        return happy
    }
}



//創建類的實例
var shape = Shape()

shape.numberOfSides = 10

shape.simpleDscription()

shape.toHappy()


//定義類的構造函數
class NamedShape{
    
    var numberOfSides:Int = 0
    
    var name: String
    
    //定義類的構造函數
    init(name:String){
        self.name = name
    }
    
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides"
    }
}

var namedShape = NamedShape(name: "hello world")

namedShape.name
namedShape.simpleDescription()


//繼承 類的繼承
class Square : NamedShape{
    var sideLength : Double
    init(sideLength: Double ,name :String){
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }

    func area() -> Double{
        return sideLength * sideLength
    }
    
    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)"
    }
}


let test = Square(sideLength: 5.12, name: "my test square")
test.area()
test.simpleDescription()



class EquilateralTriangle : NamedShape{

    var sideLength : Double = 0.0
    
    init(sideLength: Double, name: String){

        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }
    
    
    //定義屬性的setter 和 getter 方法
    var perimeter : Double {
        get{
            return 3.0 * sideLength
        }
        set{
            sideLength = newValue / 3.0
        }
    }
    
    
    override func simpleDescription() -> String {
        return "An equilateral triagle with sides of length \(sideLength)"
    }
}

var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")

triangle.perimeter
triangle.perimeter = 9.9
triangle.sideLength



//定義一個類,類中有一個函數
class Counter {
    var count: Int = 0
    
    //該方法的第二個參數有兩個參數名
    //第一個參數名是numberOfTimes,給方法的外部調用者使用
    //第二個參數名是times,給方法內部使用
    func incrementBy(amount:Int,numberOfTimes times: Int){
        count += amount * times
    }
}


//創建一個實例
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)



//定義一個枚舉
//枚舉原始值的類型是Int,所以你只需要設置第一個原始值。
//剩下的原始值會按照順序賦值。你也可以使用字符串或者浮點數作為枚舉的原始值。
enum Rank: Int {
    
    //指定該枚舉實例的原始值為1
    case Ace = 1
    case Two ,Three ,Four , Five , Six ,Seven , Eight ,Nine ,Ten
    case Jack,Queen,King
    
    func simpelDescription() -> String{
    
        switch self{
        case .Ace:
            return "ace"
        case .Jack:
            return "jack"
        case .Queen:
            return "queue"
        case .King:
            return "king"
        default:
            return String(self.rawValue)
        }
    }
}


let ace = Rank.Ace

//調用 rawValue 方法
let aceRawValue = ace.rawValue
ace.simpelDescription()



//定義不需要原始值的枚舉
enum Suit {
    case Spades,Hearts,Diamonds,Clubs
    
    func simepleDescription ()-> String {
    
        switch self {
        case .Spades:
            return "spades"
        case .Hearts:
            return "hearts"
        case .Diamonds:
            return "diamonds"
        case .Clubs:
            return "clubs"
        }
    }
}


let hearts = Suit.Hearts
let heartsHashValue = hearts.hashValue
let heartDescription = hearts.simepleDescription()


//創建一個結構體
struct Card {
    var rank : Rank
    var suit : Suit
    
    func simpleDescription() -> String {
        return "The \(rank.simpelDescription()) of \(suit.simepleDescription())"
    
    }
}

//使用 struct 來創建一個結構體。
//結構體和類有很多相同的地方,比如方法和構造器。
//它們結構體之間最大的一個區別就是,結構體是傳值,類是傳引用。
let threeOfSpades = Card(rank: .Three, suit: .Spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()



//該枚舉也不需要原始值

//一個枚舉成員的實例可以有實例值。
//相同枚舉成員的實例可以有不同的值。
//創建實例的時候傳入值即可。
//實例值和原始值是不同的:枚舉成員的原始值對于所有實例都是相同的
//而且你是在定義枚舉的時候設置原始值。
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")


//success是一個枚舉實例
switch success {
case let .Result(sunrise, sunset):
    let serverResponse = "sunrise is at \(sunrise) and sunset is at \(sunset)"
case let .Error(error):
    let serverResponse = "Failure...\(error)"
}



//============接口和擴展
//使用protocol來聲明一個接口
protocol ExampleProtocol{
    var simpleDescription : String { get }
    
    mutating func adjust()
}

//類、枚舉和結構體都可以實現接口
class SimpleClass: ExampleProtocol{
    var simpleDescription :String = "a very simple class"
    var anotherProperty : Int = 123
    
    func adjust() {
        simpleDescription += " now 100% adjusted"
    }
}

var a = SimpleClass()
a.adjust()
let desc = a.simpleDescription



//該結構體實現協議
struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "a very simple structure"
    //mutating 關鍵字用來標記一個會修改結構體的方法
    mutating func adjust(){
        simpleDescription += " (adjusted)"
    }
}


// 枚舉繼承協議
enum SimpleEnum: ExampleProtocol{
    case First(String)
    case Second(String)
    
    //屬性的get方法
    var simpleDescription:String{
        get{
            switch self{
            case let .First(text):
                return text
            default:
                return "hi"
            }
        }
        
    }
    
    mutating func adjust(){
        print("description: hi")
    }
}

var s = SimpleEnum.First("dingding")
s.simpleDescription
s.adjust()




//使用 extension 來為現有的類型添加功能,比如添加一個計算屬性的方法。
//你可以使用擴展來給任意類型添加協議
//甚至是你從外部庫或者框架中導入的類型
extension Int : ExampleProtocol{
    var simpleDescription : String {
        return "the number \(self)"
    }

    mutating func adjust() {
        self += 42
    }
}

7.simpleDescription



// 定義一個泛型函數
func repeatItem<T>(item : T,times: Int) -> [T] {

    //定義一個空的數組
    var result = [T]()
    
    for i in 0...times {
        //數組元素的追加
        result.append(item)
    }
    
    return result
}

repeatItem(3, times: 4)

============END============

 本文由用戶 seqn0777 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!