PetInfo.class
class PetInfo {
static let shared: PetInfo = PetInfo()
lazy var petArray: [PetInfo] = []
var PetID:Int
var PetName:String
...
init(){ .. }
}
ViewController.swift
class ViewController: UIViewController {
var PetArray = PetInfo.shared.petArray
override func viewDidLoad() {
super.viewDidLoad()
let pet = PetInfo()
pet.PetName = "Jack"
PetArray.append(pet). **Create Object and gave a name**
print(PetArray[0].PetName) //works!
}
}
secondViewController.swift
class secondViewController: UIViewController {
var PetArray = PetInfo.shared.petArray
override func viewDidLoad() {
super.viewDidLoad()
let label: UILabel = {
let label = UILabel()
...
label.text = PetArray[0].PetName **tried to print**
return label
}()
view.addSubview(label)
}
}
모든 뷰 컨트롤러에서 PetArray 배열을 공유하고 싶습니다. (2 개 이상입니다.) 첫 번째 VC에 데이터를 넣었지만 두 번째 VC에서는 작동하지 않습니다. 싱글 톤 패턴을 사용하여이 배열을 공유하려면 어떻게해야합니까? 배열을 제외하고는 완벽하게 작동합니다. (예 : String .. PetID, PetName ..)
Swift의 Array는 Struct로 구현됩니다. 즉, Array는 참조 유형이 아니라 값 유형입니다. Swift의 값 유형은 COW (Copy on Write) 메커니즘을 사용하여 값 변경을 처리합니다.
그래서 ViewController
당신이 할당했을 때
var PetArray = PetInfo.shared.petArray
당신 PetArray
은 여전히 당신의 PetInfo.shared
인스턴스 에서 동일한 배열을 가리키고있었습니다 (내 말은 메모리에있는 배열의 동일한 복사본을 의미합니다). 그러나 PetArray
사용하여 값을 수정하자마자
PetArray.append(pet)
COW가 시작되고 petArray
메모리에 새 복사본을 만들고 이제 PetArray
ViewController에 변수를 만들고 PetInfo.shared.petArray
더 이상 동일한 인스턴스를 가리 키지 않고 대신 메모리에있는 두 개의 다른 배열 복사본을 가리 킵니다.
따라서 사용하여 수행 한 모든 변경 사항 PetArray.append(pet)
은 액세스 할 때 분명히 반영되지 않습니다 PetInfo.shared.petArray
.secondViewController
어떡해?
제거 PetArray.append(pet)
하고 대신 사용PetInfo.shared.petArray.append(pet)
내 코드의 다른 문제는 무엇입니까?
문제 1 :
변수 이름에 Pascal 대 / 소문자 를 사용하지 var PetArray = PetInfo.shared.petArray
말고 대신 낙타 대 / 소문자 를 사용하십시오. var petArray = PetInfo.shared.petArray
문제 2 :
class PetInfo {
static let shared: PetInfo = PetInfo()
lazy var petArray: [PetInfo] = []
var PetID:Int
var PetName:String
...
init(){ .. }
}
이 구현은 PetInfo
메모리 에 존재하는 인스턴스가 하나만 있음을 보장하지 않습니다 (순수한 싱글 톤 패턴을 보장 할 수 없음을 의미 함).하지만 PetInfo
정적 변수 를 사용하는 인스턴스에 대한 액세스를 제공하더라도 shared
사용자가 PetInfo
단순 인스턴스를 여러 개 만드는 것을 막을 수는 없습니다. PetInfo()
당신이했던 것처럼 전화 하여let pet = PetInfo()
차라리 private init(){ .. }
다른 사람들이PetInfo
문제 3 :
당신 은 일종의 엉망인 패턴 PetInfo
의 인스턴스 내부 배열을 들고 있습니다. PetInfo
여기서 무엇을 성취하려고하는지 확실하지 않습니다. 이것이 정말로 당신이하고 싶은 일이라면 아마도 두 번째 점을 무시할 수 있습니다. 지금은 private init) :)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다