2017-12-18 6 views
0

스위프트에서 유형을 "주어진 크기 세트"로 구성 할 수 있습니까? (Swift에서 종속 유형이 없어도 그럼에도 불구하고 그러한 구성이 가능합니까? 과도한 "뒤틀림?")없이 예로서주어진 크기를 스위프트 유형으로 설정합니다.

, I는 그 인스턴스 세트 (Hashable) 정확히 두 개체 이루어진 T 입력 파라미터 화 된 형태 SetOfSizeTwo<T>을 정의 할 수 있도록하려는 것이다.

struct SetOfSizeTwo<T> where T: Hashable { 
    var set = Set<T>(minimumCapacity: 2) 
} 

그러나,이 유형 2.

의 크기

업데이트로 재산 set을 강요하지 않습니다

현재, 나는 가난한 사람의 프록시를 사용하고 있습니다 Ole Begemann의 블로그 기사 A hack for fixed-size arrays in Swift은 Swift 4에서 고정 크기 세트 유형의 견고한 구조가 가능하다면 중요하지 않다고 생각하게합니다.

+3

내가 가장 좋은 건과 래퍼 클래스를 만드는 것입니다 생각을 사용자 정의 추가 및 제거 메소드. 그리고 기본 데이터 구조를 비공개로 설정하여 아무도이 데이터를 조작 할 수 없도록하십시오. – Michal

+0

@Michal 귀하의 실질적인 제안에 감사드립니다. 기본적으로 컴파일 타임 제약 조건으로 설정 크기를 적용하고 이상적인 형식을 사용하려고합니다. 그러나 종속 유형에 대한 언어 지원 없이는 불가능하다고 생각합니다. – egnha

답변

1

사용자의 요구에 가장 근접한 접근 방식입니다. 그것은 가장자리 주위에 약간 거친이며, 약간의 연마를 필요로하지만 난 당신이 아이디어를 얻을 수있을 거라 생각 :

class Size { 
    let size: Int 

    init(size: Int) { 
     self.size = size 
    } 

    required init() { 
     self.size = 0 
    } 
} 

class SizeOne: Size { 
    private override init(size: Int) { 
     super.init(size: size) 
    } 

    required init() { 
     super.init(size: 1) 
    } 
} 

class SizedSet<S, T> where S: Size, T: Hashable { 
    private var set: Set<T> 
    private let maximumSize: S 

    init() { 
     set = Set<T>() 
     maximumSize = S() 
    } 

    func insert(item: T) { 
     if !set.contains(item) && set.count + 1 <= maximumSize.size { 
      set.insert(item) 
     } 
    } 

    func remove(item: T) { 
     set.remove(item) 
    } 

    func contents() -> Set<T> { 
     return set 
    } 
} 

는 사용법 :

let set: SizedSet<SizeOne, Int> = SizedSet() 
print(set.contents()) 
// [] 

set.insert(item: 1) 
print(set.contents()) 
// [1] 

set.insert(item: 2) 
print(set.contents()) 
// [1] 
관련 문제