[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])
당신이지도 기능, 또는 그 위에 변형를 시도 :
여기 당신이 후드 아래에 배열에 의해 뒷받침 가정이 동작을 구현할 수있는 방법입니다, 당신의 예를
Point
클래스를 감안할 때? – holroy