2014-09-13 1 views
0

모든 유형의 값을 받고 문자열로 변환 할 수있는 사용자 정의 컬렉션이 있습니다. 예 :getter의 반환 값과 다른 유형을 허용하는 신속한 subscript setter

collection["key"] = 10 
let value = collection["key"] // value is a String 

이 방법이 있습니까? 두 하위 스크립트 메소드를 구현하려했지만 Swift는 쓰기 전용 하위 스크립트를 지원하지 않습니다.

subscript(key: String) -> String { 
    get { ... } 
} 

// Doesn't compile 
subscript(key: String) -> AnyObject { 
    set { ... } 
} 
+0

나는 그것을 의심 :

class StorageClass { private var _value: String? public var value: Any? { set { if let num = newValue as? Int { self._value = String(format: "%d",num) } } get { return self._value } } } 

이렇게함으로써,이 같은 일을 할 수 있습니다. [File a bug] (http://bugreport.apple.com) 이것이 중요 할 수도 있지만 더 많은 가능성이 있습니다. 다른 디자인이 필요합니다. 속성에는 다른 setter 및 getter 유형이있을 수 없습니다. – rickster

+0

getter에 다른 유형을 사용할 수없는 이유는 무엇입니까? getter는 값을 사용하여 컨테이너에서 값을 가져 오기 전에 값을 문자열로 변환 할 수 있습니다. 그것을 삽입하는 데 사용 된 키를 사용하여 값을 다시 가져올 수 있다는 것이 훨씬 의미가 있습니다. – drewag

+0

이 작업을 수행하는 기존 Apple API를 래핑합니다. - [objectForKeyedSubscript :] 및 - [setObject : forKeyedSubscript :]에 대한 Obj-C 서명은 사용하는 유형이 서로 다릅니다. – ide

답변

0

은 (필요에 따라 또는 Any) AnyObject을 반환 첨자를 정의하고 시점에서 당신은 게터가 String에 결과를 캐스팅 사용합니다. 선택 사항을 반환하는 subscript을 이미 처리해야 할 수도 있습니다. 따라서 강제는 원하는 값을 추출하는 일부입니다.

if let value = collection["key"] as String { ... } 
else {...} 
0

당신은 또한 자신의 유형을 정의하고이 IntegerLiteralConvertibleStringLiteralConvertible 프로토콜을 준수 할 수 있습니다.

기술적으로는 IntegerLiteralConvertible을 준수하도록 String 확장명을 쓸 수도 있지만 전체 프로젝트에서 사용할 수 있으므로 혼란 스러울 수 있습니다.

1

당신은 두 개의 서로 다른 subscript 구현을 사용하고 그 중 하나의 게터를 사용하지 않도록 설정할 수 있습니다 :

subscript(key: String) -> String { 
    get { return "howdy" } // put real implementation here 
} 
subscript(key: String) -> AnyObject { 
    get { fatalError("Oooops") } 
    set { } 
} 

그러나, 이것은 여전히 ​​맥락에서이 두 subscript 호출을 구별하는 방법에 대한 질문을 열어 둡니다.

subscript(key: String) -> String { 
    get { return "howdy" } // put real implementation here 
} 
subscript(# any: String) -> AnyObject { 
    get { fatalError("Oooops") } 
    set { } 
} 

그리고 여기에 사용하는 방법은 다음과 같습니다 :

let m = MyClass() 
m[any:"thing"] = 1 
println(m["thing"]) // "1", presumably 
0
내가 여기에 비슷한 문제에 직면했다

을 나는 일반적인를 사용하여 해결 그들의 외부 매개 변수 이름을 통해 서로 다른 서명을 제공하기 위해 더 나은 것 내 변수를 입력하고 getter에서 원하는 유형을 반환합니다. 이 같은 일을 시도 할 수 있습니다 :

var storage = StorageClass() 
storage.value = 10 /* setting value as an Integer */ 
let aString = storage.value as! String /* receiving a String value back */ 
관련 문제