Разные результаты с Set хотя и похожий код? Какова точная проблема в Swift?

у меня небольшая проблема. У меня есть два массива, где я пытаюсь найти в нем одно и то же содержимое. Поэтому я решил преобразовать его в набор, а затем использовать эти замечательные функции с вычитанием. Однако я получаю совсем другие результаты. Может кто-нибудь сказать мне, почему это происходит? Когда я использую вычитание вместо вычитания, у меня не возникает проблем, однако для меня это очень странно, и я действительно понятия не имею, почему это происходит.

   var objectIDsWhichExist = [ "kjugsJHL6JYoByOreUQ0wUefsbX2", "18ixZ21PJDXA1WzeJqZzctl7tTk2", "ZeQPYGfDvWMLSVykb4M5FQ6miGX2"]
    var helperObjectIDsWhichExistInAdded = [ "kjugsJHL6JYoByOreUQ0wUefsbX2", "18ixZ21PJDXA1WzeJqZzctl7tTk2"]
    


    var setA = Set(objectIDsWhichExist) /* Updated Data*/
    var setB = Set(helperObjectIDsWhichExistInAdded) /* Standard Data*/
    let different = setA.subtract(setB) // I GET HERE ()  
    print(different) // I GET THIS RESULT "()\n"

И это единственный образец, который, на удивление, работает. Однако я до сих пор не знаю, почему???

    var employees: Set = Set(objectIDsWhichExist)
    let neighbors: Set = Set(helperObjectIDsWhichExistInAdded)
    employees.subtract(neighbors)
    print(employees) // HERE IT DOES WORK because i get this -> ["ZeQPYGfDvWMLSVykb4M5FQ6miGX2"]\n"

person esen    schedule 16.03.2021    source источник


Ответы (1)


subtract и subtracting вычисляет разницу в 2 множества, но subtract мутирует, тогда как subtracting нет.

Это означает, что x.subtract(y) заменяет набор x на вычисленную разницу, тогда как x.subtracting(y) вообще не меняет x, а вместо этого возвращает разницу. С другой стороны, subtract ничего не возвращает (Void).

Когда вы делаете

let different = setA.subtract(setB) // I GET HERE ()  
print(different)

вы видите, что () печатается, потому что именно так выглядит строковое представление Void — пустой кортеж.

Это работает

employees.subtract(neighbors)
print(employees)

потому что subtract заменяет employee.

Это также работает:

let different = setA.subtracting(setB)
print(different)

потому что возвращаемое значение subtracting — установленная разница — назначается different. Обратите внимание, что это не меняет setA.

Это не работает:

employees.subtracting(neighbors)
print(employees) // still shows the original employees

Потому что subtracting не меняет employees, и вы игнорируете его возвращаемое значение.

Есть много других пар таких мутирующих и немутирующих методов, например

  • Set.formUnion vs Set.union
  • String.append vs String.appending

Похожий пост

person Sweeper    schedule 16.03.2021
comment
Большое спасибо за подробное объяснение этого. Большое вам спасибо за то, что вы нашли время, чтобы дать мне такой отличный ответ! - person esen; 16.03.2021