안녕하세요, 다른 구조체의 속성 인 배열 안에 구조체를 추가해야합니다. 저는 Swift 3을 사용하고 있지만 아무 것도 추가하지 않고 왜 그런지 모르겠습니다. 도움이 필요하세요?
import Foundation
struct Product {
var objectId: String
var name: String
var price: Double
var qty: Int
var img: String
var desc: String
var note: String
}
struct Order {
var objectId: String
var name: String
var detail: [Product]
mutating func addToDetail(_ product: Product) {
detail.append(product)
}
}
class OrderManager: NSObject {
static let shared = OrderManager()
var order: Order?
var orderCreated: Bool {
return self.order != nil
}
var partnerInOrder: String? {
return self.order?.objectId
}
func createOrderIfNeeded(partnerId: String, name: String) {
if self.order == nil {
self.order = Order(objectId: partnerId, name: name, detail: [Product]())
}
}
func addProduct(objectId: String, name: String, price: Double, qty: Int, img: String = "", desc: String = "", note: String = "") {
guard var order = self.order else {
return
}
let hasProduct = order.detail.contains(where: { $0.objectId == objectId })
if !hasProduct {
order.addToDetail(Product(objectId: objectId, name: name, price: price, qty: qty, img: img, desc: desc, note: note))
}
print("has product \(hasProduct)")
print("the whole order is \(self.order)")
}
func addOption() {}
func getProduct() {}
func getOption() {}
fileprivate func storeOrder() {}
}
구조체의 addToDetail func 내부에 있지만 항상 내 배열이 비어 있습니다.
다음 guard
문에서 (의 방법 addProduct
에서 OrderManager
)
guard var order = self.order else { /* ... */ }
당신은 만들 사본 의 self.order
(가 아니라고 주어진을 nil
인해 스위프트의 구조의 값 의미로). addToDetail
이 복사본에 대한 후속 호출 은 Product
의 인스턴스 변수 order
에 인스턴스를 추가하지 않고 self
범위를 addProduct
벗어난 범위를 벗어나는 복사본에만 인스턴스를 추가합니다 .
guard
위 의 문 에서 선택적 바인딩 절을 간단한 nil
검사 로 대체하여이 이론을 테스트 할 수 있습니다 (@MartinR이 아래에서 지적했듯이 우리는 실제로 guard
문 이 필요하지 않습니다 (수정 후 : 바인딩 없음). return
의 경우 self.order
이다 nil
)
if self.order == nil { return }
또는 명시 적 nil
검사를 모두 제거하고 선택적 연결을 사용 product
하여 order
인스턴스에을 추가할지 여부를 결정합니다 ( nil
검사와 hasProduct
단일 선택적 연결 절에서).
func addProduct(objectId: String, name: String, price: Double, qty: Int, img: String = "", desc: String = "", note: String = "") {
if !(self.order?.detail.contains(where: { $0.objectId == objectId }) ?? true) {
order?.addToDetail(Product(objectId: objectId, name: name, price: price, qty: qty, img: img, desc: desc, note: note))
}
// ... remove the logging
}
그러나 이것은 코드의 의도를 보여주는 더 나쁜 일을합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다