2016年4月21日 星期四

Swift: 給第一次碰Xcode的初學者


App coda
Swift 新手系列之一: 打造你的第一個 iOS App
http://www.appcoda.com.tw/hello-world-app-swift/

大推這個網站寫的Swift新手入門,適合給剛安裝好Xcode但還沒用過的人看!

對入門的開發學習者來說,熟悉開發平台的UI是一項不容易的事情,
我覺得Xcode很多地方設計得不錯,

像視覺化的Storyboard跟寫code的Assistant Editor可以在同一個畫面看,
互相做連結,而且不太會有變數名稱混淆的情況。

使用性越友善的開發平台就越能招到更多的開發者加入呀~~~



祝學習之路順利!

Swift: 按一下螢幕任意處就可以關掉鍵盤的方法

這個方法需要兩段code如下:

    @IBAction func onExit(sender: AnyObject){
        sender.resignFirstResponder()

    } //這段會跟文字輸入區域有關連,要跟兩個text field連結



    @IBAction func onClick(sender: AnyObject){
        tf1.resignFirstResponder()
        tf2.resignFirstResponder()
    } //這段會跟背景的觸控有關聯,跟背景連結


在開始前,要把整個螢幕變成一個「可控制的」屬性,請看下圖:


接下來也用截圖來說明,請試試看:

Step 1


Step 2


Step 3

(Sorry, it should be just yellow when your cursor are not on it.)

Step 4


Step 5


Step 6


Step 7









2016年4月19日 星期二

Swift: Segment的操作練習

看圖理解,
Segment 就是圖中"first"跟"second"那個可以讓人點選的按鈕,
他們是歸在一組的,所以通常會是同類型的切換鈕。

這張圖的左半是畫面,右半是code,
其中三個綠框框內各代表了一個function,
他們前端都有一個灰色點,跟著箭頭指向左邊的元件,
這就是需要在Xcode中建立“圖形元件”與“function”連結的地方,
我們就可以很直觀知道哪段function會跟哪個按鈕有關聯。

實心的灰色點表示有連結到東西,空心的代表沒有連東西。
可以用按右鍵拖曳的方式,把按鈕拉到function的code上,
他就會有個框框提示跑出來,放開就可以建立連結了。
(例外註:當專案關掉再開,然後直接開.swift檔時,可能會看到空心,
這時打開StoryBoard它就會再連上,沒有的話就要再check了。)



以下是整段code:
(出自於Swift書:用Swift語言一次搞定所有蘋果裝置的程式開發 / 佳魁出版)

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var tv: UITextView!
    @IBOutlet weak var tf: UITextField!
    @IBOutlet weak var segmented: UISegmentedControl!

    override func viewDidLoad() {
        super.viewDidLoad()
        onChanged(segmented)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func onAdd(sender: AnyObject){
        let count = segmented.numberOfSegments
        let title = tf.text
        if title!.characters.count > 0 {
            segmented.insertSegmentWithTitle(title, atIndex: count, animated: true)
        }
    } // 動態增加segment的函數
    
    @IBAction func onDelete(sender: AnyObject){
        let index = segmented.numberOfSegments - 1
        if index > 0 {
            segmented.removeSegmentAtIndex(index, animated: true)
        }
    } // 動態刪除segment的函數
    
    @IBAction func onChanged(sender: AnyObject){
        let index = segmented.selectedSegmentIndex
        let title = segmented.titleForSegmentAtIndex(index)!
        tv.text = "選取了第\(index + 1)個分段,標題是:\(title)"
    } // 顯示選取的segment

}

一面寫一面思考這些文章會對誰有幫助,坦白說這個blog很難讓初學者看了就能學會,
主要是我做學習筆記用,會把重要的部分整理成一篇文章以後複習,
Xcode的安裝、環境設定跟基本操作一般書中、網路上都有介紹,
而且一定需要自己花時間熟悉摸索,若你也是初學者,不妨看看我貼的內容,
也許多少能找到有益的資料。

一面跟著書做練習,一面撞牆,一面完成小功能,偶爾發現書中的錯誤 / bug,
或 Xcode / Swift 更新的東西,這就是學習的苦與樂吧。

繼續加油!



2016年4月18日 星期一

Swift: Class 跟 繼承

繼續跟著《Swift 從入門到超人氣遊戲App開發全面修練實戰》這本書學Swift,
看到class跟繼承的用法,對於 init 不是很懂,google到Jason Kuan's Blog
有很專業的說明,但我只稍微更懂了一點,下面的code是我理解了的部分:
(code來自於上面提到的書)

-------------------------------------------------------------------------------
class MyPeople {
    var name = ""
   
init(Name:String){
       
name = Name
    }
   
func getName() -> String {
       
return "\(name)"

    }
 

}

class MyStudent : MyPeople {
   
var StudentID = ""
   
override func getName() -> String {
       
let t_name = super.getName()
       
return "\(name), \(t_name)'s student ID is \(StudentID)"

    }

}

var Peo1 = MyPeople(Name: "Peiwen Wu")
print(Peo1.getName())

var Peo2 = MyStudent(Name: "Bruce Wu")
Peo2.StudentID = "98381450"
print(Peo2.getName())
-------------------------------------------------------------------------------
//執行結果如下

Peiwen Wu
Bruce Wu, Bruce Wu's student ID is 98381450


我把上面的code分藍根綠兩色,藍代表母類別,綠代表子類別,
同樣呼叫了getName時根據各自的定義而有不同結果,
但name屬性的賦予上,子類別就繼承母類別,能方便物件的管理。

在MyPeople中func getName() -> String { return "\(name)"}這邊可看到,
-> String代表會回傳一個字串的變數回去,
return代表會推出一個東西出來,接到String那邊出去。

MyStudent的 override 應該是代表它要繼承母類別的getName(),
裡面的super.getName()就用到了母類別中定義的getName(),
傳回一個值(name)回來,再用到MyStudent裡的getName,
完成特殊需求(加上學生証號的回傳值)

這些override, super.funtion() 的語法多練幾次就會比較熟了,
看下圖再試著理解一次:



繼續加油!!!


Swift: Var是什麼東西?學寫程式的開始

我們剛開始規劃一個程式時,至少一定會有一項"任務"要由程式完成,
這個任務的定義必須很清楚,清楚到每個小螺絲釘都要逐一定義,
才能獲得正確的執行結果。


寫程式可以分成三個階段:A→B→C

A. 無中生有一些東西,
B. 組合使用這些東西,
C. 然後產出結果。

下面逐一來說明。


A. 無中生有一些東西

我們的任務是 "從五個句子中,印出其中 一行句子 "

要定義的東西如下:

1. 五行句子,它們都必須有名字 (我們才能知道要呼叫誰)
2. 一個數字,也要有名字
3. "印出" 的這個功能也要定義一下

Swift的語法就是這麼用:

var str_nice = "超好吃的啦!"
var str_fine = "還不錯唷!"
var str_ok = "還可以,普通。"
var str_bad = "不怎麼樣。"
var str_awful = "難吃到我想吐..."

var star1 = 1
var star2 = 2
var star3 = 3
var star4 = 4
var star5 = 5

看到var一出現,就知道:
我要無中生有一個東西(變數),然後定義這個東西(變數)是什麼。
(var是variable的縮寫,意思是"可變的東西")

str_nice ... str_awful   這些就是自己取的變數名字;
"="                              這個符號有指定的意思;
"超好吃的啦!"        這個就是我們賦予該變數的內容

如果上面的說明都懂了,那接下來的
var srar1 = 1

我們就知道這代表「我要生一個變數,叫做star1,它的內容是1
注意,因為變數可以有很多種可能的類型,像數字、文字,
數字又有分很多種,所以一旦定義了它的內容之後,
就不能換類型了。電腦會根據我們賦予的內容而自動判斷變數的類型。
(字串取名str,因為str是string的縮寫,意思就是"字串")

OK,繼續下去。


B. 組合使用這些東西

print (str_nice)

這行code很明瞭的會幫我們印出 str_nice - "超好吃的啦!"
如果我們肯定知道東西一定很好吃,那今天任務可以結束,
不過若有可能跑出別的結果,我們還是得多加一點變化性。

這裡會使用到function,中文叫"函式"(詳細看這篇),
function裡面可以定義很多行為,當一次呼叫時,
它就會一次處理所有定義的動作。

func comment (words:String = "我再想想...") {
        print (words)
}

comment (xxxxxxx)  //這一行就是呼叫上面定義的function

當我們抽換xxxxxxx為 str_nice 或 str_bad 時,
它就會把 str_nice 或 str_bad 丟進comment裡面,
然後你看上面的{ } 中有個words變數就會把它"接住"!!
接著透過 print (words) 被印出來,任務完成!

comment (str_fine)

執行結果:

"還不錯唷!"

Q.「等等,那之前定義的 star1 ... srat5 呢?」
A.「function還有更多變化,您不妨試著探索看看。」


C. 然後產出結果

結果已經產出了,我文章寫得不是很好|||,在stage B. 中。


回顧一下,
寫程式可以分成三個階段:A→B→C

A. 無中生有一些東西,
B. 組合使用這些東西,
C. 然後產出結果。


繼續加油!



Swift: Control Flow (Loop)

這個官方的教學網頁裡面介紹了for loop, while loop
並且教我們用loop, while, case寫一個"蛇與階梯"(Snakes and ladders)的遊戲,
非常適合初學者學完基礎後,想知道怎麼把它們組合起來,
程式長度約幾十行,不妨跟著教學走走看!


(圖片取自:Apple官方Swift教學網頁)

2016年4月17日 星期日

Swift: function的基本


以下是一個最簡單swift function的例子:

var word = "hello!!!!!" //定義一個叫做word的字串內容為"hello!!!!!"                 
func sayhello(str:String = "Yes!!"){                                            
    print(str)                                                                 
}                       //定義一個叫做say hellofunction能夠印出代入的字串                       
sayhello(word)          //word字串代入say hello中並且呼叫sayhello               
sayhello()              //沒有字串代入sayhello,所以代入預設的"Yes!!"(參照上面的code)


===========程式執行結果=============
hello!!!!!
Yes!!
===========程式執行結果=============



我們寫程式的時候,有時遇到複雜的結構,code越寫越多,會越難管理,
function的好處,在於先定義一個「行為包」,一個程式可以有好多個行為包,
等到需要用的時候就呼叫這個「包」,對開發的人來說,再落落長的程式行為都能清楚畫分。

另一個好處,就是需要修改時,可以很清楚不會改到其他functions。

最上面短短的六行程式中,
第一行 var word = "hello!!!!!"
定義了一個「變數」(variable),可以是數字或是字串(定義var請看這篇)
第二~四行 定義了一個function
func sayhello(){
    print("hello")
}

這裡說明一下二~四行的結構:
func                //即將要定義一個function
sayhello()          //取function名字為sayhello, ()裡面可以定義要代入的預設變數,或是空著
{ print("hello") }  //{ }定義function裡面做的行為

第五、六行就不用再說明,請參考上面就有的註解囉!


我們在下面再練習一個function的例子:

var greeting = "yoyo!"
func speak(content:String = "Hi."){
     print(content)
}
speak(greeting) // 會印出: yoyo!
speak()             // 會印出: Hi.


Swift: 在字串中抽換特定字元

在找問題時翻到這段code,覺得蠻有用,記錄起來:
(抱歉因為中途關掉網頁,若有違原出處請見諒)


let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput.characters {
    switch character {
    case "a", "e", "i", "o", "u", " ":
        continue
    default:
        puzzleOutput.append(character)
    }
}

print(puzzleOutput)


當input內容為:"great minds think alike"
執行結果如下:
grtmndsthnklk


Swift: for / for in (range) loop

現在剛開始學swift,剛安裝了Xcode(7.3),覺得它的介面還頗友善,可以在下方即時顯示執行的code。

在跟著書(書名很長,碁峯出版,作者柯博文)一面試基本的操作語法,發現有些跟書不一樣了,可能是swift本身有在更新,像for迴圈:

書上寫:

for var index = 0 ; index < 3; index++ {
     print("index is \(index)")
}

執行結果會是
index = 0
index = 1
index = 2

但即時編譯時跑出訊息說以後不再支援這種像C的寫法,
會改成:

for index in 0 ..< 3 {
     print("index is \(index)")
}

(注意第一行0 ..< 3空格的地方要對)
精省也直覺了不少,而且不用像VB要dim(宣告)東西一樣先用var定義。


下面講另一種範圍的loop,
書上寫:

for index in range(3):
     print("index = \(index)")

現在也行不通了,要改成:

for index in 4 ... 6 {
     print("index = \(index)")
}

結果就會是:
index = 4
index = 5
index = 6



2016年4月15日 星期五

VB 可以切換的頁面

我想做一個像下圖中,上排可以切換不同的畫面,
例如從商品出貨的頁面切到商品進貨的頁面。




'以下撞牆過程,沒時間可以直接忽略
'這個MSDN的網頁有教怎麼做能切換的兩個form,
'但是會開啟一個,關掉一個,而且不是在同個位置,
'對我來說頗為不實用。

'然後我google了"vb form switch",找到這個網頁(stack overflow),提問的人描述:
'"...in short I want the user to get a feel that he is working on one form only..."

'恩,這就是我要的。


'shit... 但是我看不懂。User Control(使用者控制項什麼的)把我考倒了。

'以上撞牆過程結束


'以下最佳解答

google"vb 切換 頁面"找到這個叫Level Up的網站,
裡面提到其實內建的 tabControl 就可以達到我的需求!

把它拉進畫面就可以了,參數再慢慢調


右下角這裡點下去


每個page都可以在這裡調整




表面上就暫時成了,接下來要研究怎麼在這些子頁面中做更多動作。