• 2

Swift交流討論區

Apple本次發表會發佈了新的語言來取代之前的!

對岸都已經很熱烈的討論,不過看台灣的論壇好像沒多少文章

相較之下真的很少,希望這個主題可以大家一起來交流,不然每次要看簡體中文也挺累的!

最近開始看Apple的文件,寫到目前為止有個問題一直讓我覺得怪怪的!

程式碼如下

import Foundation

let shoppinglist = [
"book" : [1,2,3,4,5],
"Game":[10,20,30,40,50],
"iPhone":[100,200,300,400,500]
]

var lagter = 0

for(kind,numbers) in shoppinglist {
for number in numbers{
println(kind , number)
if number > lagter{
lagter = number
}
println(lagter)
}
}

----------------------------------------------------

這個是原廠提供的PDF上面的範例,當然名稱有自己改變,然後習慣了解所有程式碼的數據變化

所以都會一行一行印出來!!

不過印出的結果反而是

(book, 1)
1
(book, 2)
2
(book, 3)
3
(book, 4)
4
(book, 5)
5
(iPhone, 100)
100
(iPhone, 200)
200
(iPhone, 300)
300
(iPhone, 400)
400
(iPhone, 500)
500
(Game, 10)
500
(Game, 20)
500
(Game, 30)
500
(Game, 40)
500
(Game, 50)
500

---------

目前讓我不解的是 按照程式流程 我的陣列是先Book 然後應該是會是Game但是反而變成是iPhone

的陣列先載入,不知道哪邊寫錯會是出錯!!

如果按照我的思維 我目前的程式碼執行結果應該是

(book, 1)
1
(book, 2)
2
(book, 3)
3
(book, 4)
4
(book, 5)
5
(Game, 10)
10
(Game, 20)
20
(Game, 30)
30
(Game, 40)
40
(Game, 50)
50
(iPhone, 100)
100
(iPhone, 200)
200
(iPhone, 300)
300
(iPhone, 400)
400
(iPhone, 500)
500
2014-07-02 14:20 發佈
ilbed wrote:
Apple本次發表會...(恕刪)


剛剛去查了一下 我覺得你是對的
這是書上的例子
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    println("\(animalName)s have \(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs”

Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/us/jEUH0.l

當你在iterate the dictionary 的時候應該會按照順序的, 我也不是很確定 lol

##############
import Foundation

01. let shoppinglist = [
02.     "book" : [1,2,3,4,5],
03.     "Game":[10,20,30,40,50],
04.     "iPhone":[100,200,300,400,500]
05. ]
06.
07. var lagter = 0

08. for(kind,numbers) in shoppinglist {
09.     for number in numbers{
10.         println(kind , number)
11.         if number > lagter{
12.             lagter = number
13.         }
14.         println(lagter)
15.     }
16. }


ilbed wrote:
Apple本次發表會...(恕刪)


kind 依字母排序過了
所以是因為kind的關係

會自動把陣列中的排序按照英文字母排序然後載入

那如果我不想按照字母排序 想要用陣列的宣告順序載入要怎麼用呢?

不過我按照我程式碼的話應該也會先載入Book的陣列然後是Game最後才是iPhone
請看這邊, 我剛剛又去查了一下關於Dictionary的解釋, Dictionary在swift裡的定義是
(1) "Dictionary stores an unordered collection of item of the same type with a key."
(2) "Swift’s Dictionary type is an unordered collection. The order in which keys, values, and key-value pairs are retrieved when iterating over a dictionary is not specified."
(3) "The only restriction(of the Dictionary) is that KeyType must be hashable"

因此, 我認為swift的Dictionary應該跟Perl的hash一樣, 存在其中的資料不是按照順序的, 因為 key在儲存的時候會被hash過. 所以如果你要print出你想要的結果, 你可能要寫像這樣
for(kind,numbers) in sort(shoppinglist.keys,
                    { (s1: String, s2: String) -> Bool in
                        return s1 < s2
                    }) {}

OR

for(kind,numbers) in sort(shoppinglist.keys, {$0 < $1}) {}
#不確定能不能跑 我完全是用Perl hash的方法去猜的


PS。在 swift 裡有提供 sort(), definition : Swift’s standard library provides a function called sort, which sorts an array of values of a known type, based on the output of a sorting closure that you provide.


Unlike items in an array, items in a dictionary do not have a specified order. You use a dictionary when you need to look up values based on their identifier

已有說明, 你不能向array一樣, 認為他有一定的順序, 一定要用key值去find & 取得value

如果按照這樣來說

要如何Key值呢? 因為沒接觸過Swift所以對這個還不熟

程式碼要如何修改!

或是有沒有swift的函示庫可以參考,因為我Google都找不到!?

另外我利用二樓的code來改寫

1. let numberOfLegs = ["spider": [1,2,3],
2. "ant": [10,20,30],
3. "cat": [100,200,300]
4. ]
5.
6. var lagter = 0
7.
8. for (kind, legCount) in numberOfLegs {
9. println(kind)
10. for number in legCount{
11. if number > lagter{
12. lagter = number
13. }
14. println(lagter)
15. }
16. }

印出來是可以按照順序的

但是程式碼一樣只剩下名稱不一樣@@?

blue65 wrote:
Unlike ite...(恕刪)
小弟在obj-c中也遇到過這樣的問題。最後,小弟為dictionary中的key製作了一個array,再以array的次序滙入dictionary 的對應的value,問題便解決了。

不知道有否聰明的辦法?
所以每次在練習寫程式都習慣一行一行印出來看數值變化

有時候真的會發生很神奇的事情!!

另外可以提供OJ-C的簡易寫法嗎?

ilbed wrote:
所以每次在練習寫程式...(恕刪)


可以試試看這個嗎

// descendant    

import Foundation

let shoppinglist = [
        "book" : [1,2,3,4,5],
        "Game":[10,20,30,40,50],
        "iPhone":[100,200,300,400,500]
    ]

var lagter = 0
// $0<$1 // ascendant
for(kind,numbers) in sort(shoppinglist,{$0>$1}) {
    for number in numbers{
        println(kind , number)
        if number > lagter{
            lagter = number
        }
        println(lagter)
    }
}


請告知能不能跑 lol 我沒裝IDE
thx
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?