2015-06-03 87 views
0

我想問一下如何解決我的問題。我只是簡單地將一些「門戶」附加到依賴國家。每個「門戶」不止一次,我不想追加。避免在追加對象的同時追加值

我有下面的類定義:

class cls_main{ 
    var countries:[cls_country]! 

    init() { 
     countries = [cls_country]() 
    } 

    // "add Country" 
    func addCountry(iCountry:cls_country) { 
     countries.append(iCountry) 
    } 

} 

class cls_country{ 

    var countryName:String! 
    var portals:[cls_portal]! 

    init() { 
     portals = [cls_portal]() 
    } 

    // "add Portal" 
    func addPortal(portName:String) { 

     var tmpPortal = cls_portal() 
     tmpPortal.portalName = portName 

     println("-->Input Portal: \(tmpPortal.portalName)") 

     if portals.count == 0 { 
      portals.append(tmpPortal) 
     } else { 
      for port in portals { 
       if port.portalName == portName {    
        println("SAME INPUT, DONT SAVE") 
       } else { 
        portals.append(tmpPortal) 
       } 
      } 
     } 

    } 

    func arrayCount(){ 
     println("Portals : \(portals.count)") 
    } 
} 

class cls_portal{ 
    var portalName:String! 
} 

所以我將其稱之爲:

var MAIN = cls_main() 
var country = cls_country() 

country.countryName = "USA" 
country.addPortal("Dance") 
country.addPortal("Dance") // Should not be appended... 
country.addPortal("Hike") 
country.addPortal("Swim") 
country.addPortal("Play") 

MAIN.addCountry(country) 
country = cls_country() 

添加值後林遍歷值,並打印出來。其結果將是這樣的:

循環:

for country in MAIN.countries { 
     println("COUNTRY: \(country.countryName)") 

     if country.countryName == "USA" { 
     for portal in country.portals { 
      println(" -> PORTAL : \(portal.portalName)") 
     } 
     country.arrayCount()  
     } 
} 

結果:

-->Input Portal: Dance 
-->Input Portal: Dance 
SAME INPUT, DONT SAVE 
-->Input Portal: Hike 
-->Input Portal: Swim 
-->Input Portal: Play 
COUNTRY: USA 
-> PORTAL : Dance 
-> PORTAL : Hike 
-> PORTAL : Swim 
-> PORTAL : Swim 
-> PORTAL : Play 
-> PORTAL : Play 
-> PORTAL : Play 
-> PORTAL : Play 
Portals : 8 

那麼,爲什麼每次和各門戶網站將在年底被乘以?非常感謝你。

回答

0

在您的搜索循環中,您正在查看每個元素後是否確定tmpPortal是否在您的portals中。在做出決定之前,您需要潛在地查看所有項目。添加一個變量found注意它已被找到。一旦找到該項目,您可以將break移出循環。

if portals.count == 0 { 
    portals.append(tmpPortal) 
} else { 
    var found = false 
    for port in portals { 
     if port.portalName == portName { 
      println("SAME INPUT, DONT SAVE") 
      found = true 
      // found it, stop searching 
      break 
     } 
    } 
    if !found { 
     portals.append(tmpPortal) 
    } 
} 
0

你在數組上循環多次,檢查它。但對於不是匹配的每個元素,都要插入門戶。所以當有3個其他不匹配的元素時,你插入一個門戶3次。

嘗試用這種替代你的內環(一切從if portals.count ==一路下跌到else結束):

if !contains(portals, { $0.portalName == portName }) { 
    portals.append(tmpPortal) 
} 

contains是檢查的功能,如果一個集合(如您的門戶網站的陣列)包含符合特定條件的條目。該標準由閉包確定,在這種情況下,它將檢查元素的入口名稱是否與您正在檢查的入口名稱匹配。如果您不熟悉閉包,請嘗試閱讀this link - 它們在Swift中可能非常有用。

P.S.代碼中還有其他一些內容可能需要重新考慮。例如,最好避免使用implicitly-unwrapped optionals(即後面帶有!的類型)。隱式可選項在Swift中用於某些特定目的,它看起來不像在代碼中適用。特別是與數組不同 - 最好在初始化時使數組爲空。但是,如果沒有國家名稱的門戶沒有意義,你可以將它作爲初始化程序的一部分。

因此,不是這樣的:

class cls_country{ 

    var countryName:String! 
    var portals:[cls_portal]! 

    init() { 
     portals = [cls_portal]() 
    } 
} 

// and in use: 
var tmpPortal = cls_portal() 
tmpPortal.portalName = portName 

,你可以這樣寫:

class cls_country { 
    var portals = [cls_country]() 
    // consider let not var if a country will never 
    // need to change its name: 
    let countryName: String 

    init(countryName: String) { 
     self.countryName = countryName 
     //no need to initialize portals in init 
    } 
} 
// then later, in use: 
var tmpPortal = cls_portal(countryName: portName) 
0

如果您正在使用雨燕1。2更好的解決方案是使用Set,所以你根本不需要addPortal方法。集提供幾乎與數組相同的功能,但它不會存儲相同的值。請注意,爲了使它與set一起工作,cls_portal類必須採用可排序且公平的協議。

一個集合在同一個集合中存儲不具有定義順序的相同類型的不同值。當項目順序不重要時,或者需要確保項目只出現一次時,您可以使用組作爲數組的替代項。