2015-02-03 5 views
2

x은 point라는 배열을 보유하고있는 개체입니다.신속하게 배열에 숫자 조각을 할당하는 방법

xx[i]과 같은 일을 할 수 있도록 배열 연산자를 구현하여 배열의 i 번째 요소 (일반적으로 Int 또는 Double 인 T 유형)를 가져옵니다.

이것은 내가하고 싶은 것입니다 :

x[0...2] = [0...2] 

을하지만 ClosedInterval<T>는 지능/더블로 변환되지 않습니다라는 오류가 발생합니다.

EDIT1가 : 차기와 웃음에 대한

let x = Point<Double>(dimensions:3) 

: 나는 x[0...2]를 통해 첫 n 요소를 얻을 수 있습니다 x

[1.0,2.0,0.0]로 정의

여기 내 객체 x입니다.

[0.0, 0.0.0.0]을 (를) 유지하기 위해 x [0 ... 2]를 (를) 업데이트하는 방법을 알고 싶습니다. 직관적으로, 나는 x[0...2] = [0...2]을하고 싶을 것이다. 이것은 답변에서 볼 수있는 것처럼 작동하지 않습니다. 나는 내 말에 반복하지 않고 x을 업데이트하고, x은 배열이 아니라는 사실을 숨겨서 (심지어는 그렇지 않더라도) 업데이트하려고합니다.

+0

당신이지도 기능, 또는 그 위에 변형를 시도 :

여기 당신이 후드 아래에 배열에 의해 뒷받침 가정이 동작을 구현할 수있는 방법입니다, 당신의 예를 Point 클래스를 감안할 때? – holroy

답변

0

이와 같이 여러 개의 할당을 처리하려면 subscript(InvervalType)을 구현해야합니다. 그것은 자동으로 수행되지 않습니다.

+0

더 말할 수 있습니까? 나는 아래 첨자 (InvervalType)를위한 구글 검색을했고 아무 것도 발견하지 못했다. – user678392

4

[0...2]은 기껏해야 0에서 2까지의 Range<Int>이 될 하나의 요소가있는 배열입니다. 예를 들어 Int을 포함하는 슬라이스에는 할당 할 수 없습니다.

x[0...2]은 (아마도) 슬라이스이며 Sliceable은 설정자가 아닌 get 아래 첨자만을 정의합니다. 따라서 형식이 더 호환되는 경우에도 마찬가지입니다. 즉, x의 범위를 비슷한 크기의 컬렉션 값으로 바꾸려고 시도한 x[0...2] = 0...2을 시도한 경우에도 여전히 작동하지 않습니다.

편집 : @rintaro가 지적한대로 배열 범위에 대한 세터 첨자를 지원하지 않습니다 - 그래서 x이 범위 인 경우에 당신이 x[0...2] = Slice(0...2)을 할 수있는 -하지만 당신 할당 조각이어야한다, 그래서 나는 여전히 replaceRange으로 갈 것 .

var x = [0,1,2,3,4,5] 
var y = [200,300,400] 
x.replaceRange(2..<5, with: y) 
// x is now [0,1,200,300,400,5] 
:

무엇을 의미하는 것은 당신이 어떤 값으로 2를 통해 항목 0을 교체 할 경우

, 당신이 원하는 것은 한 컬렉션 (예를 들어, Array는 않습니다) RangeReplaceableCollection에 부합로, replaceRange입니다

대체 된 범위와 y이 같은 크기 일 필요는 없으므로 필요에 따라 컬렉션이 확장/축소됩니다.

또한 y은 배열이 아니어도 모든 종류의 컬렉션이 될 수 있습니다 (시퀀스가 아니라 컬렉션이어야 함).

var x = [0,1,2,3,4,5] 
var y = lazy(2...4).map { $0 * 100 } 
x.replaceRange(2..<5, with: y) 

편집 : 그래서 위의 코드는 다음과 같이 기록 된 수 있도록, 자리에서 한 번에 모든 크기의 배열을 제로로 편집 한 당에, 당신은 할 수 있습니다 :

var x = [1.0,2.0,0.0] 
// range to replace is the whole array's range, 
// Repeat just generates any given value n times 
x.replaceRange(indices(x), with: Repeat(count: x.count, repeatedValue: 0.0)) 

부분 범위를 0으로 설정하려면 범위 및 항목 교체 횟수를 적절하게 조정하십시오.

struct Point<T: FloatLiteralConvertible> { 
    private var _vals: [T] 

    init(dimensions: Int) { 
     _vals = Array(count: dimensions, repeatedValue: 0.0) 
    } 

    mutating func replaceRange 
     <C : CollectionType where C.Generator.Element == T> 
     (subRange: Range<Array<T>.Index>, with newElements: C) { 

     // just forwarding on the request - you could perhaps 
     // do some additional validation first to ensure dimensions 
     // aren't being altered... 
     _vals.replaceRange(subRange, with: newElements) 

    } 

} 

var x = Point<Double>(dimensions:3) 
x.replaceRange(0...2, with: [1.1,2.2,3.3]) 
+0

x가 배열이 아닙니다. 나는 그것을 하나 (n - dim 점)로 취급하기를 바랬습니다. 그것은 배열을 보유하고 있습니다. – user678392

+0

물론, 여전히 replaceRange와 동등한 것이 필요합니다 - 구현체를 포함 된 객체로 전달할 수 있습니다. –

+1

@AirspeedVelocity FWIW,'Array'는 슬라이더에 대한 setter를 구현합니다. 마지막 예제에서,'_vals [subRange] = Slice (newElements)'가 작동해야합니다. – rintaro

관련 문제