2015-06-03 45 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类必须采用可排序且公平的协议。

一个集合在同一个集合中存储不具有定义顺序的相同类型的不同值。当项目顺序不重要时,或者需要确保项目只出现一次时,您可以使用组作为数组的替代项。