Pertanyaan Operator identitas di Swift


Jika a identik dengan c, b identik dengan c, mengapa a tidak identik dengan b?

var a = [1, 2, 3]
var b = a
var c = a[0...2]
a === c                    // true
b === c                    // true
a === b                    // false

Jika a, b, c adalah konstanta:

let a = [1, 2, 3]
let b = a
let c = a[0...2]
a === c                    // true
b === c                    // true
a === b                    // true

5
2018-06-06 03:01


asal


Jawaban:


Seperti kata @onevcat, itu mungkin bug Playground. Dan jika Anda berubah a ke objek tipe referensi, semua tes identitas akan true.

class K {}
var a = [K(), K(), K()]
var b = a
var c = a[0...2]
a === c                    // true
b === c                    // true
a === b                    // true

itu artinya itu a, b & c berbagi penyimpanan dan elemen yang sama.


0
2018-06-06 04:06



Anda dapat menghapus import Cocoa atau import UIKit jika Anda bermain dengan PlayGround untuk membuatnya benar. Tampaknya ada beberapa jenis peta dalam kerangka Cocoa untuk mengacaukan segalanya. Seharusnya ini bug, kurasa.


2
2018-06-06 03:38



Menarik, tebakan saya adalah bahwa sejak c adalah var dalam kasus pertama, yang bisa berubah dan karenanya harus membuat salinan. Dengan begitu jika Anda menambahkan ke c itu tidak akan berubah a. Dalam kasus kedua, semuanya berubah sehingga mereka dapat menunjuk ke ruang memori yang sama


0
2018-06-06 03:12