顯示具有 Swift 標籤的文章。 顯示所有文章
顯示具有 Swift 標籤的文章。 顯示所有文章

2015/02/13

Swift 消除Optional type

下面這段程式碼看起來蠻正常的
不過在輸出時總是會出現Error,後來透過println輸出才發覺多出一個


修改前Code:
    override func viewDidLoad() {
        super.viewDidLoad()
        var s:NSString? = "1234"
        println(s)
    }

只需要在該變數後面加上!就不會有Optional


修改後Code:
    override func viewDidLoad() {
        super.viewDidLoad()
        var s:NSString? = "1234"
        println(s!)
    }

Swift String to Double


Code:
    override func viewDidLoad() {
        super.viewDidLoad()
        var s:NSString = "1234"
        var d = s.doubleValue
        println(d)
    }


參考資料:
http://stackoverflow.com/questions/24031621/swift-how-to-convert-string-to-double

Swfit IOS add marker on the Google Maps

Code:
//
//  ViewController.swift
//  Sample
//
//  Created by C.Y.Fang on 2/10/15.
//  Copyright (c) 2015 C.Y.Fang. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    let url = "http://data.kaohsiung.gov.tw/Opendata/DownLoad.aspx?Type=2&CaseNo1=AU&CaseNo2=1&FileType=2&Lang=C&FolderType=O"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        var camera = GMSCameraPosition.cameraWithLatitude(22.60583276,
            longitude: 120.307702,  zoom: 10)
        var mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
        self.view = mapView
        let json:AnyObject! = getJsonFromURL(url)
        drawMaker(mapView, json: json)
    }

    private func getJsonFromURL(url:String)->AnyObject?{
        let url = NSURL(string: url)
        let data = NSData(contentsOfURL: url!)
        return NSJSONSerialization.JSONObjectWithData(data!,
            options: NSJSONReadingOptions.AllowFragments, error: nil)
    }
    
    private func drawMaker(mapView:GMSMapView, json:AnyObject?){
        if let array = json as? NSArray {
            for temp in array{
                let name = temp["車站中文名稱"] as NSString!
                let lat = (temp["車站緯度"] as NSString!).doubleValue
                let lng = (temp["車站經度"] as NSString!).doubleValue
                
                var market = GMSMarker()
                market.position =  CLLocationCoordinate2DMake(lat ,lng)
                market.title = name
                market.map = mapView
            }
        }
    }
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


}

執行結果:


2015/02/12

Swift IOS Read JSON from url

JSON資料使用高雄市公車路線資料

先將url透過NSURL建構子建立該常數,再將NSURL給予NSData建構子,回傳資料為NSData

let data = getDataFromUrl(url)!

func getDataFromUrl(url:String) -> NSData? {
        let url = NSURL(string: url)
        
        if(url == ""){
            return nil
        }
        
        return NSData(contentsOfURL: url!)
    }



再透過NSJSONSerialization.JSONObjectWithData方法將Data轉成AnyObject

並將其JSON依照高雄市公車路線資料的格式輸出




func printJson(object:AnyObject){
        if let array = object as? NSArray{
            for temp in array{
                var id:AnyObject! = temp["ID"]
                var departure:AnyObject! = temp["departureZh"]
                var destination:AnyObject! = temp["destinationZh"]
                println("車牌號碼\(id) 起點\(departure) 目的\(destination)")
            }
        }
    }


Swift IOS Read project file

Project內有一個檔案『test.txt』,裡面文字檔如下圖
讀取檔案內的文字,可透過NSString建構子將文字讀出

首先先透過下面這個方法取得Bundle內指定的檔案
NSBundle.mainBundle().pathForResource


判斷該String是否為nil,如果是就回傳空字串
if(file == nil){
            return ""
        }

如果不是就傳回檔案中的文字,並以UTF8去編碼
        return NSString(contentsOfFile: file!, encoding: NSUTF8StringEncoding, error: nil)

Swift IOS write a file


Code:
//
//  ViewController.swift
//  Sample
//
//  Created by C.Y.Fang on 2/12/15.
//  Copyright (c) 2015 C.Y.Fang. All rights reserved.
//

import UIKit

class ViewController: UIViewController {


    let fileName = "test.cy"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let directory = NSSearchPathForDirectoriesInDomains(
            .AllLibrariesDirectory, .UserDomainMask , true)[0] as String
        let path = "\(directory)/\(fileName)"
        
        NSData().writeToFile(path, atomically: true)
        
        if(NSFileManager.defaultManager().fileExistsAtPath(path)){
            println("yes")
        }else{
            println("no")
        }
    }
    


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}


執行結果:

2015/02/10

Swift 使用Google Maps SDK for IOS撰寫iPhone App

先下載Google Maps SDK for IOS並解壓縮,下載同時建立專案,並到Google Play Developer Console將Google Maps SDK for iOS功能開啟,建立一組IOS Key






Google Maps SDK for IOS解壓縮後會看到GoogleMaps-iOS-1.9.1資料夾,將『GoogleMaps.framework』和Resources資料夾內的『GoogleMaps.bundle』複製到專案的『Frameworks』資料夾(沒有Frameworks資料夾須自行建立)


『GoogleMaps.framework』複製到專案時,須將Copy Items if needed打勾,並選擇Create folder references

而『GoogleMaps.bundle』複製到專案時,不需將Copy Items if needed打勾,並選擇Create folder references




加入Objective-C Header,名稱隨意打,程式碼為
#import <GoogleMaps/GoogleMaps.h>


Swift 使用Objective-C Library 以Google Maps為例

Swift如果要調用Objective-C則可以在Swift Project內新增一個Objective-C的Header




2014/07/02

Swift willSet didSet

willSet:變化前做什麼事情
didSet:變化後做什麼事情


//
//  main.swift
//  Test
//
//  Created by CYFang on 7/2/14.
//  Copyright (c) 2014 CYFang. All rights reserved.
//

import Foundation

class Animal : NSObject{
    var name:NSString = "cat"{
    
        //變化前
        willSet{
            println("Animal name is \(name)")
        }
    
        //變化後
        didSet{
            println("Animal name is \(name)")
        }
    }
}


var animal:Animal = Animal()
animal.name="dog"

執行結果:

2014/06/14

Hello OS X 使用Swift

第一次開發OSX程式感覺到非常興奮,沒有開發過關於Apple產品的程式
這次要謝謝盈宏哥指導,不然操作Xcode開發OSX對我來說有點難XD


首先新增一個專案,Application/Cocoa Application

Product Name:Hello,語言要選擇Swift

選擇儲存位址

2014/06/12

Swift 修飾詞

_:任意值
..:n to m - 1
...:n to m
fallthrough:會使得條件成立時,且會執行下一個條件
typealias:給予形態一個別名,類似C的struct的alias
enum:列舉
let:定義常數
var:定義變數
willSet:變化前做什麼事情
didSet:變化後做什麼事情

Swift function

Swift某些地方真的很像C XDD
我在書上看到了這段程式碼,感到非常興奮

這個方法回傳值Int指到Int,意即該Int變數指到Int回傳值的方法
所以該方法必須先宣告成變數,並透過變數再將值傳遞進入才能得到值

另一個範例則是

list指到numbers這個Array
condition指到lessThanTen方法

意即for in再走訪時,會透過item以迭代的方式取得list陣列的值並比較是否有小於10
如果其中一項成立則回傳true,反之回傳false


Swift typealias

typealias:給予形態一個別名,類似C的struct的alias

//
//  main.swift
//  test
//
//  Created by CYFang on 6/6/14.
//  Copyright (c) 2014 CYFang. All rights reserved.
//


//類似C的struct的alias
typealias CYString = String

var cy:CYString = "C.Y. Fang"

println(cy)
println(cy.uppercaseString)


執行成果:

Swift String

hasPrefix:比較前者字串
hasSuffix:比較字尾
uppercaseString:轉換為大寫
lowercaseString:轉換為小寫
==:比較內容值是否相同
compare:比較字元有差異則為-1,正確則為0
isEmpty:判斷是否為空值

2014/06/09

Swift 列舉(Enumerations)



//
//  main.swift
//  test
//
//  Created by CYFang on 6/6/14.
//  Copyright (c) 2014 CYFang. All rights reserved.
//

//return Array to Integer
class Animal{

    enum AnimalEnum : Int{
        case Cat = 1
        case Dog = 2
        case Tiger = 3
        case Monkey = 4
        case Zebra = 5
        case Elephants, Whale
    
        func Name()->String{
            switch self{
                case .Cat:
                    return "Cat"
                case .Dog:
                    return "Dog"
                case .Tiger:
                    return "Tiger"
                case .Monkey:
                    return "Monkey"
                case .Zebra:
                    return "Zebra"
                case .Elephants:
                    return "Elephants"
                case .Whale:
                    return "Whale"
                default:
                    return "People"
            }
        }
    }
}

var mType = Animal.AnimalEnum.Zebra
println("\(mType.toRaw()):\(mType.Name())")
println("\(Animal.AnimalEnum.fromRaw(1)?.toRaw()):\(Animal.AnimalEnum.fromRaw(1)?.Name())")



執行結果:

Swift Setter and Getter

Setter:僅可以設定非本身的值,因為尚未分配到屬性
Getter:用於回傳值


//
//  main.swift
//  test
//
//  Created by CYFang on 6/6/14.
//  Copyright (c) 2014 CYFang. All rights reserved.
//

//return Array to Integer
class CY{
    var bmi:Float = 0.0
    var cm:Float = 0.0
    var kg:Float{
        set{bmi = newValue/(cm*cm)}
        get{return bmi * cm * cm}
    }
    
    init(bmi:Float, cm:Float){
        self.bmi = bmi
        self.cm = cm
    }
}

var fatter = CY(bmi:29.0, cm:1.78)
println(fatter.kg)

fatter.kg = 130
println(fatter.bmi)


執行結果:

2014/06/08

Swift class and override



//
//  main.swift
//  test
//
//  Created by CYFang on 6/6/14.
//  Copyright (c) 2014 CYFang. All rights reserved.
//

//return Array to Integer
class Shape{
    var height:Double = 0.0
    var width:Double = 0.0
    
    init(){}
    
    init(height:Double){
        self.height = height
    }
    
    init(height:Double, width:Double){
        self.height = height
        self.width = width
    }
    

    func getArea() -> Double{
        return 0.0
    }
    
}

class Rectangle:Shape{
    init(height: Double, width: Double) {
        super.init(height:height, width:width)
    }
    
    override func getArea() -> Double{
        return self.width * self.height
    }
}

class Triangle:Shape{
    var upper:Double = 0.0
    
    init(height: Double, upper : Double) {
        super.init(height:height)
        self.upper = upper
    }
    
    override func getArea() -> Double{
        return (self.upper * self.height)/2
    }
}


class Keystone:Shape{
    var upper:Double = 0.0
    var lower:Double = 0.0
    
    init(height : Double, upper : Double, lower : Double){
        super.init(height : height)
        self.upper = upper
        self.lower = lower
    }
    
    override func getArea() -> Double{
        return ((self.lower + self.upper) * self.height) / 2
    }
}

class Circle:Shape{
    let pi:Double = 3.14
    var r = 0.0
    
    init(heigth : Double){
        super.init(height : heigth)
        self.r = heigth/2
    }
    
    override func getArea() -> Double{
        func pow(x:Double, y:Double) -> Double{
            var sum:Double = 1.0
            
            for index in 1...y{
                sum*=x
            }
            return sum
        }

        var sum = pow(self.r, 2.0)
        return sum * self.pi
    }

    
}

var mRectangle = Rectangle(height : 10, width : 10)
println(mRectangle.getArea())

var mTriangle = Triangle(height : 10, upper : 10)
println(mTriangle.getArea())

var mKeystone = Keystone(height: 5, upper: 4, lower: 6)
println(mKeystone.getArea())

var mCircle = Circle(heigth: 6)
println(mCircle.getArea())


執行結果:

Swift for n in range、while and do while

..:n到m-1
...:n到m
while:前置判斷
do while:後置判斷


//
//  main.swift
//  test
//
//  Created by CYFang on 6/6/14.
//  Copyright (c) 2014 CYFang. All rights reserved.
//

println("從n走訪m-1")
for index in 1..11{
    print("\(index) ")
}


println("\n\n從n走訪m")
for index in 1...11{
    print("\(index) ")
}


println("\n\nWhile")
var min = 0

while min < 10{
    min++
    print("\(min) ")
}

println("\n\nDo while")
var max = 10
do{
    println(max)
    max++
}while max < min


執行結果:

Swift for in走訪字典(Dictionary)

再原廠的教科書上看到了這篇,覺得蠻有趣的




//
//  main.swift
//  test
//
//  Created by CYFang on 6/6/14.
//  Copyright (c) 2014 CYFang. All rights reserved.
//

let m_Dictionary = [
    "A" : [1, 2, 3, 4, 5, 6, 7, 8, 9],
    "B" : [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
    "C" : [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]]

//透過key and values走訪
for (name, numbers) in m_Dictionary{
    println(name + ":\(numbers)")
    for number in numbers{
        print("\(number) ")
    }
    println()
}

//有點類似Python的tupleXD
for index in m_Dictionary{
    println(index)
}



執行結果:

Swift let and var

2014WWDC,蘋果推出了Swift這個新語言,這個語言應該不算新穎,在2013時就有些消息,這消息讓我感到十分的感興趣,因為之前有過Objective-C的小小開發經驗,有點不習慣。
看了下Doc這語言可能會幫助開發者更快速地開發Apple的產品,只是希望這產品不會到最後變成孤兒..

let:用於宣告常數
var:用於宣告變數
for:用法則有點類似JavaScript
for in:用法有點類似C#的用法