struct — ano ito, mga pangunahing konsepto at syntax sa Swift

May-akda: IT Sectr Nai-publish: 2026-06-17 Oras ng pagbabasa: 7 min

Struct — ay isang value type sa wikang Swift, na ang mga instance ay kinokopya kapag inilipat sa pagitan ng mga bahagi ng code. Hindi tulad ng mga klase, ang mga istruktura ay hindi sumusuporta sa pamana, ngunit nagpapatupad ng mga protocol, naglalaman ng mga property at method, at nagbibigay ng predictable na pamamahala ng memorya nang walang ARC. Ayon sa Swift Programming Language Guide, 2026, ang struct ay pangunahing bloke ng pagbuo ng Swift — kahit ang mga standard na uri na Int, String, Array at Dictionary ay ipinatupad bilang mga istruktura. Inirerekomenda ng wika ang mga istruktura bilang prayoridad na pagpipilian para sa pagmomodelo ng data.

Mga Pangunahing Punto

  • Struct — value type sa Swift, na kinokopya kapag itinalaga at ipinapasa ayon sa halaga, hindi ayon sa sanggunian.
  • Copy-on-Write — optimisasyon kung saan ang aktwal na pagkopya ng data ay nangyayari lamang kapag nagbago ang halaga, hindi kapag itinalaga.
  • Mutating — ang keyword na kinakailangan para sa mga method na nagbabago ng mga property ng istruktura.
  • Mga Protocol — ang mga istruktura ay maaaring magpatupad ng mga protocol at extension, na nagbibigay ng kakayahang umangkop nang walang pamana.
  • Kaligtasan — ang kawalan ng mga reference cycle ay ginagawang mas gusto ang mga istruktura para sa multi-threaded code at mga modelo ng data.

Ano ang struct sa Swift?

Struct (istruktura) — ay isang pinagsamang uri ng data sa Swift na nagpapangkat ng mga kaugnay na property at method sa iisang entity. Hindi tulad ng mga klase, ang mga istruktura ay value types: kapag ipinasa sa isang function o itinalaga sa isang bagong variable, isang malayang kopya ng istruktura ang ginagawa, hindi isang sanggunian sa orihinal na bagay.

Gumagamit ang Swift ng mga istruktura para sa lahat ng primitive na uri: Int, Double, String, Bool, Array, Dictionary at Set. Nangangahulugan ito na kahit ang pangunahing bilang na Int ay kumikilos bilang isang istruktura — kapag itinalaga, isang kopya ang ginagawa. Maaaring tukuyin ng developer ang kanyang sariling istruktura na may anumang hanay ng mga property at method.

Ayon sa Swift Evolution (SE-0143), ang desisyon na ipatupad ang mga standard na uri bilang mga istruktura ay udyok ng pagganap at predictability. Ang value types ay hindi lumilikha ng mga reference cycle, hindi nangangailangan ng ARC reference counting at ginagarantiyahan na ang pagbabago sa kopya ay hindi makakaapekto sa orihinal — ito ay kritikal para sa immutability ng data sa mga multi-threaded na senaryo.

Struct bilang value type

Value type semantics — ang pangunahing pagkakaiba sa pagitan ng struct at class. Kapag nagtalaga ka ng istruktura sa isang bagong variable o ipinasa ito sa isang function, lumilikha ang Swift ng malayang kopya ng lahat ng data. Anumang pagbabago sa kopya ay hindi makakaapekto sa orihinal, na nag-aalis ng mga side effect na katangian ng mga reference type.

swift
// Halimbawa ng semantika ng value type
struct Point {
    var x: Double
    var y: Double
}

var p1 = Point(x: 10, y: 20)
var p2 = p1        // Ang p2 ay isang malayang kopya ng p1
p2.x = 99            // Ang p2 lamang ang nagbabago
print(p1.x)         // 10 — p1 hindi nagbago
print(p2.x)         // 99

Copy-on-Write optimisasyon

Gumagamit ang Swift ng Copy-on-Write (COW) upang i-optimize ang pagkopya. Kung maraming variable ang tumutukoy sa parehong istruktura, ngunit wala sa kanila ang nagbabago ng data, ang aktwal na pagkopya ay hindi nangyayari. Ibinabahagi ng Swift ang memorya sa pagitan ng mga variable hanggang sa unang mutation — pagkatapos ay ginagawa ang isang tunay na kopya. Pinipigilan nito ang mga labis na operasyon ng alokasyon at pinapabilis ang pagtatrabaho sa mga koleksyon.

Pagbabago at mga mutating method

Bilang default, ang mga method ng istruktura ay hindi maaaring baguhin ang mga property nito — nangangailangan ang Swift ng malinaw na indikasyon ng mutating para sa mga method na gumagawa ng mga pagbabago. Ang paghihigpit na ito ay nagpoprotekta laban sa aksidenteng mutation at ginagawang predictable ang code: kung ang isang method ay hindi minarkahan ng mutating, garantisadong hindi mo babaguhin ang istruktura.

Mutating sa aksyon

Kapag idinagdag mo ang keyword na mutating bago ang method, nakakakuha ang Swift ng kakayahang magsulat ng mga bagong halaga sa mga property ng istruktura. Sa katunayan, ang method ay maaaring ganap na palitan ang instance ng istruktura ng bago sa pamamagitan ng self = . Ang mekanismong ito ay ginagamit, halimbawa, sa mga uri ng Option at Result.

swift
// Struct na may mutating method
struct Counter {
    private var value: Int = 0

    // Mutating method — maaaring baguhin ang mga property
    mutating func increment() {
        value += 1
    }

    // Mutating method ay maaaring ganap na palitan ang self
    mutating func reset() {
        self = Counter()
    }

    // Non-mutating method — para lamang sa pagbasa
    func currentValue() -> Int {
        return value
    }
}

var counter = Counter()
counter.increment()
print(counter.currentValue())  // 1
counter.reset()
print(counter.currentValue())  // 0

Mga patakaran para sa mutating: ang istruktura ay dapat ideklara sa pamamagitan ng var, hindi let — ang isang constant na istruktura ay hindi maaaring tumawag ng mutating method. Sinusuri ito ng compiler sa yugto ng kompilasyon: ang pagtatangkang tumawag ng mutating method sa isang let constant ay magdudulot ng error sa kompilasyon.

Struct vs Class: paghahambing

Ang pagpili sa pagitan ng struct at class — isa sa mga pangunahing desisyon sa Swift. Ang parehong uri ay maaaring maglaman ng mga property, method, initializer at magpatupad ng mga protocol, ngunit may mga pangunahing pagkakaiba sa semantika ng memorya, pamana at pamamahala ng siklo ng buhay.

Katangianstructclass
UriValue type (kinokopya)Reference type (sanggunian)
PamanaHindi sumusuportaSumusuporta
ARC / pagbibilang ng sanggunianHindi kinakailanganKinakailangan ang ARC
De-inisyalisasyonHindi sumusuportaSumusuporta sa deinit
Pagbabago ng property sa constantSa pamamagitan lamang ng varMaaari sa pamamagitan ng let (constant ang sanggunian)
Type castingHindi sumusuportaSumusuporta
Pag-iimbak sa mga koleksyonDirektang iniimbak (halaga)Iniimbak bilang sanggunian (pointer)

Mas gusto ang mga istruktura kapag ang data ay hindi nangangailangan ng pamana, hindi dapat magkaroon ng nakabahaging pagkakakilanlan (halimbawa, mga coordinate, sukat, configuration) at ipinapasa sa pagitan ng mga modyul. Pinipili ang mga klase para sa mga bahagi ng UI (UIView, UIViewController), singleton at mga bagay na may nakabahaging pagkakakilanlan.

Kailan pumili ng struct

Inirerekomenda ng Apple ang paggamit ng struct bilang default na uri para sa pagmomodelo ng data sa Swift. Ang mga istruktura ay angkop para sa karamihan ng mga senaryo dahil sa predictable na semantika ng pagkopya at kawalan ng overhead para sa pagbibilang ng sanggunian. Tingnan natin ang mga karaniwang kaso kung kailan ang struct ay pinakamainam na pagpipilian.

Mga modelo ng data nang walang pamana

Kung ang entity ay naglalaman ng data nang walang pangangailangan ng pamana (Product, User, Order, Point), gamitin ang struct. Awtomatikong bumubuo ang compiler ng memberwise initializer — hindi mo kailangang sumulat ng init nang manu-mano. Ang Equatable at Hashable ay awtomatiko ring ipinatutupad para sa mga istruktura na ang lahat ng property ay nakakatugon sa mga protocol na ito.

Hindi nababagong (immutable) data

Para sa mga configuration, setting at flag na hindi nagbabago pagkatapos ng paggawa, ang struct ay mas gusto kaysa class. Ang isang constant (let) na istruktura ay ginagarantiyahan ang immutability ng lahat ng nested field — sa class ito ay nauukol lamang sa sanggunian, hindi sa nilalaman ng bagay.

Multi-threaded code

Ang mga istruktura ay ligtas sa multi-threaded na kapaligiran dahil sa value semantics. Ang bawat thread ay tumatanggap ng malayang kopya ng data at hindi nakakaapekto sa iba pang mga thread. Ang race condition sa pagitan ng mga thread ay imposible para sa value types, na ginagawang struct ang mas gustong pagpipilian para sa mga modelo sa SwiftUI (ObservableObject ay nangangailangan ng class, ngunit ang @State ay gumagamit ng struct).

swift
// Halimbawa ng paggamit ng struct para sa modelo ng data
struct User: Codable, Identifiable {
    let id: UUID
    var name: String
    var email: String
    var isPremium: Bool

    // Computed property — non-mutating
    var displayName: String {
        isPremium ? "\(name) ⭐️" : name
    }
}

// Awtomatikong memberwise initializer
let user = User(
    id: UUID(),
    name: "Alice",
    email: "alice@example.com",
    isPremium: true
)

// Ang pagkopya ay ligtas para sa multi-threading
var userCopy = user
userCopy.isPremium = false
// Ang user.isPremium ay nananatiling true

Gamitin ang class kapag kailangan mo ng pamana (mga bahagi ng UIKit/AppKit), nakabahaging pagkakakilanlan (delegate, observer) o kontroladong siklo ng buhay ng mga bagay (deinit). Para sa lahat ng iba pa — struct.

Mga Madalas Itanong

Ano ang struct sa Swift?

Struct sa Swift — ay isang value type na kinokopya kapag inilipat sa pagitan ng mga bahagi ng code. Ang mga istruktura ay maaaring maglaman ng mga property, method, initializer at magpatupad ng mga protocol. Ang mga pangunahing uri ng Swift (Int, String, Array) ay ipinatupad bilang mga istruktura.

Ano ang pagkakaiba sa pagitan ng struct at class sa Swift?

Struct — value type (kinokopya kapag itinalaga), hindi sumusuporta sa pamana at hindi nangangailangan ng ARC. Class — reference type (ipinapasa sa pamamagitan ng sanggunian), sumusuporta sa pamana, de-inisyalisasyon at pagbibilang ng sanggunian. Inirerekomenda ng mga developer ang struct bilang default na uri.

Ano ang mutating sa struct Swift?

Mutating — ang keyword na nagpapahiwatig na ang method ng istruktura ay maaaring baguhin ang mga property nito. Kung walang mutating, ipinagbabawal ng compiler ang pagbabago ng mga field. Ang mga mutating method ay maaari lamang tawagin sa mga variable na idineklara sa pamamagitan ng var, hindi let.

Ano ang Copy-on-Write sa Swift?

Copy-on-Write (COW) — optimisasyon ng Swift para sa mga istruktura, kung saan ang aktwal na pagkopya ng data ay ipinagpapaliban hanggang sa sandali ng unang mutation. Habang ang lahat ng variable ay nagbabasa lamang ng istruktura, nagbabahagi sila ng isang lugar ng memorya. Pinapabuti nito ang pagganap kapag nagtatrabaho sa malalaking koleksyon.

Kailan gagamitin ang struct at kailan ang class sa Swift?

Gamitin ang struct para sa mga modelo ng data nang walang pamana, configuration, DTO at multi-threaded na senaryo. Gamitin ang class para sa mga bahagi ng UI UIKit/AppKit, singleton, entity na may nakabahaging pagkakakilanlan (delegate, observer) at mga bagay na nangangailangan ng de-inisyalisasyon.

Buod

  • Struct — ay isang value type sa Swift, na kinokopya kapag itinalaga, na nagbibigay ng predictable na pag-uugali nang walang mga side effect sa pagitan ng mga kopya.
  • Copy-on-Write nag-o-optimize ng pagganap ng mga istruktura — ang tunay na pagkopya ay nangyayari lamang sa unang mutation, hindi sa bawat pagtatalaga.
  • Ang mga standard na uri ng Swift — Int, String, Array, Dictionary — ay ipinatupad bilang mga istruktura, na ginagarantiyahan ang value semantics para sa lahat ng pangunahing operasyon.
  • Mutating — sapilitang keyword para sa mga method na nagbabago ng mga property ng istruktura; ang pagtawag ay posible lamang sa mga instance ng var.
  • Ang mga istruktura ay hindi sumusuporta sa pamana, ngunit nagpapatupad ng mga protocol at maaaring gumamit ng mga extension upang magdagdag ng functionality.
  • Equatable at Hashable ay awtomatikong ipinatutupad para sa mga istruktura na ang lahat ng property ay nakakatugon sa mga protocol na ito — pinapasimple nito ang paghahambing at paggamit sa mga koleksyon.
  • Inirerekomenda ng Apple ang struct bilang default na uri — gamitin lamang ang class kapag kinakailangan ang pamana, nakabahaging pagkakakilanlan o kontroladong siklo ng buhay ng bagay.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din