programing

스위프트의 한 조각은 무엇입니까?

batch 2023. 8. 4. 22:46
반응형

스위프트의 한 조각은 무엇입니까?

Swift의 슬라이스는 무엇이며 배열과 어떻게 다릅니까?

설명서에서 첨자(범위)의 형식 서명은 다음과 같습니다.

subscript(Range<Int>) -> Slice<T>

다른 제품을 반품하는 것은 어떻습니까?Array<T>가 아니라Slice<T>?

슬라이스를 배열과 연결할 수 있을 것 같습니다.

var list = ["hello", "world"]
var slice: Array<String> = [] + list[0..list.count]

그러나 이는 다음과 같은 오류를 발생시킵니다.

제공된 인수를 수락하는 '오버로드'에 대한 오버로드를 찾을 수 없습니다.

var list = ["hello", "world"]
var slice: Array<String> = list[0..list.count]

한 조각이란 무엇입니까?

슬라이스가 배열을 가리킵니다.배열이 이미 존재하고 슬라이스가 원하는 부분만 설명할 수 있다면 다른 배열을 만드는 것은 의미가 없습니다.

추가는 암묵적인 강요를 유발하므로 효과가 있습니다.할당 작업을 수행하려면 다음을 수행해야 합니다.

var list = ["hello", "world"]
var slice: Array<String> = Array(list[0..<list.count])

참고: 이 답변은 Swift 베타 3부터 유효하지 않습니다. 이제 어레이가 실제 값 유형이기 때문입니다.


@상기 - 이상으로 정확합니다.Slice<T>배열에 대한 점입니다.Swift가 작업 중인 다른 모든 데이터 유형을 처리하는 방식과는 반대로 보입니다. 이는 슬라이스가 상수로 선언되더라도 슬라이스의 값이 변경될 수 있음을 의미하기 때문입니다.

var arr = ["hello", "world", "goodbye"]    // ["hello", "world", "goodbye"]
let slice = arr[0..2]                      // ["hello", "world"]
arr[0] = "bonjour"
println(slice)                             // ["bonjour", "world"]

가장 나쁜 부분은 슬라이스가 배열처럼 작동한다는 것입니다.Swift에서 불변성에 대한 기대를 고려할 때 슬라이스의 구독 값이 경고 없이 변경될 수 있다는 것은 위험해 보입니다.

println(slice[1])                          // "world"
arr[1] = "le monde"
println(slice[1])                          // "le monde"

그러나 기본 배열이 너무 크게 변경되면 연결이 해제됩니다.

arr.removeAtIndex(0)                       // this detaches slice from arr
println(slice)                             // ["bonjour", "le monde"]
arr[0] = "hola"
println(slice)                             // ["bonjour", "le monde"]

요약:.

위의 답변은 베타 3 이전까지는 사실이었습니다(향후 릴리스에서 다시 변경될 수 있음).

슬라이스는 이제 배열과 동일하게 작동하지만, 위에서 @matt가 말한 것처럼 변경할 때까지 후드 아래 배열에 대한 얕은 복사입니다.슬라이스(지금)에는 원래 값의 스냅샷이 표시됩니다.

또한 슬라이스 구문이 변경되었습니다.

[from..upToButNotIncluding] -> [from..<upToButNotIncluding]

예:

var arr = ["hello", "world", "goodbye"] // ["hello", "world", "goodbye"]
var arrCopy = arr
let slice = arr[0..<2]                  // ["hello", "world"]
arr[0] = "bonjour"
arr                                     // ["bonjour", "world", "goodbye"]
arrCopy                                 // ["hello", "world", "goodbye"]
slice                                   // ["hello", "world"]

이를 통해 파이썬 스타일 목록 처리(하나의 목록을 필터링하여 다른 목록을 만드는 것)가 더 간단하기 때문에 훨씬 더 균일한 처리가 가능합니다.베타 3 이전 Matt의 답변에 따르면 슬라이스를 매핑하기 위해 임시 배열을 만들어야 했습니다.이제 새 코드가 더 단순해졌습니다.

class NameNumber {
    var name:String = ""
    var number:Int = 0

    init (name:String, number:Int) {
        self.name = name
        self.number = number
    }
}

var number = 1
let names = ["Alan", "Bob", "Cory", "David"]
let foo = names[0..<2].map { n in NameNumber(name:n, number:number++) }
foo     // [{name "Alan" number 1}, {name "Bob" number 2}]

(공정하지만, foo는 여전히 한 조각입니다.)

참조:

http://adcdownload.apple.com/ /Developer_Tools/xcode_6_beta_3_lpw27r/xcode_6_beta_3_release_notes_.pdf

중요한 변화, 문제점 해결, - 신속한 언어, 1항

"Swift의 Array는 Dictionary 및 String...m과 같은 완전한 가치의 의미를 갖도록 완전히 재설계되었습니다."

언급URL : https://stackoverflow.com/questions/24073269/what-is-a-slice-in-swift

반응형