2017-04-04 1 views
1

는 어쩌구 배열이 약간 다르게 작동하는 것입니다 당신이재정의 수 (또는 무엇이든) 특정 배열은

class Blah { 
} 

을 가지고 있고 나는 그러나 [Blah]

을 가지고 갈거야 말 정상 배열.

예를 들어, 나는 count는 다음과 같이 작업 할

override count { 
    c = super.count // an ordinary count of the array 
    y = count of items where blah.color = yellow 
    return y 
} 

은 물론, 내가 스위프트의 적절한 배열 개념을 하위 클래스 수 (또는 무엇이든)을 재정의하는 방법을 알고 말한다.

그러나 배열 [Blah] ...에서 "유일한"개수를 어떻게 재정의 할 수 있습니까?

사용 사례 - 어쩌면 더 좋은 방법이 있습니다. Blah에는 많은 구체적인 하위 유형이 있습니다. Blah, B : Blah .. F : Blah [Blah]를 필터링하여 특정 부분 만 반환하도록합니다 (예 : B 및 D 유형 만 ") 열거하고 개수 등은 켜진 부속 유형에만 해당됩니다. 스위프트의 슬라이스에 감사 드리며 여기에서 관련성이 있습니다.

+0

경우에도 * * 배열의 특정 유형에 대한 재정의'count'은 (AN은'Array'는'struct', 그래서 아무 하위 클래스이다), 의미를 변경할 수있는 좋은 생각되지 않을 것입니다 수 그런 잘 정립 된 개념의 예를 들어'for index in 0 .. Hamish

+0

@Hamish가 맞습니다.'count'를 무시하는 것은 좋은 생각이 아닙니다. 이제는 '무엇이든'부분에 대해 'Array'에 대한 유형 제약이 도움이 될 것입니다. 'extension Array where Element : Blah' – Alladinian

+0

아래 Andrew의 대답에 동의합니다. 그냥 명시 적으로; 이 마술을하려고하지 마십시오. 즉, 마술과 함께 할 수는 있지만 ObjC 런타임을 사용해야합니다. ISA를 사용하여 개체 (예 : KVO와 동일한 개체)를 바꿀 수 있습니다. "진짜"클래스의 서브 클래스 인 새로운 클래스를 생성하고, 원하는'count' 구현을 추가 한 다음, ISA 포인터 ('object_setClass')를 바꿉니다. 하지만 와우,이 일은 절대해서는 안되 ... : D –

답변

1

사람들이 언급하는 것처럼 실제로 카운트를 무시하고 싶지는 않습니다. 왜 이것이 작동하지 않는지와 다른 가능한 해결책을 제시하는 몇 가지 코드가 있습니다.

//: Playground - noun: a place where people can play 

class Blah { 

    let include: Bool 

    init(include: Bool) { 
     self.include = include 
    } 

} 

// This code "works", but you'll get an error that "count" is ambiguous because 
// it's defined in two places, and there's no way to specify which one you want 
//extension Array where Element: Blah { 
// 
// var count: Int { 
//  return reduce(0) { result, element in 
//   guard element.include else { 
//    return result 
//   } 
// 
//   return result + 1 
//  } 
// } 
// 
//} 

// But you could add a helper to any blah sequence that will filter the count for you 
extension Sequence where Iterator.Element: Blah { 

    var includedBlahCount: Int { 
     return reduce(0) { result, blah in 
      guard blah.include else { 
       return result 
      } 

      return result + 1 
     } 
    } 

} 

let blahs = [Blah(include: false), Blah(include: true)] 
print(blahs.count) // 2 
print(blahs.includedBlahCount) // 1