Swift - Başlatma

Swift 4'te bildirilen sınıflar, yapılar ve numaralandırmalar, bir sınıfın örneğini hazırlamak için başlatılır. İlk değer, depolanan özellik için başlatılır ve ayrıca yeni örnekler için de değerler, daha ileri gitmek için başlatılır. Başlatma işlevi yaratmak için anahtar sözcük, 'init ()' yöntemi ile gerçekleştirilir. Swift 4 başlatıcısı, herhangi bir değer döndürmediği için Objective-C'den farklıdır. İşlevi, işlenmeden önce yeni oluşturulan örneklerin başlatılmasını kontrol etmektir. Swift 4 ayrıca, örnekler serbest bırakıldıktan sonra bellek yönetimi işlemlerini gerçekleştirmek için "yeniden başlatma" süreci sağlar.

Depolanan Özellikler için Başlatıcı Rolü

Depolanan özellik, örnekleri işlemeden önce sınıfları ve yapıları için örnekleri başlatmalıdır. Depolanan özellikler, değerleri atamak ve başlatmak için başlatıcıyı kullanır, böylece özellik gözlemcilerini çağırma ihtiyacını ortadan kaldırır. Başlatıcı, depolanmış mülkte kullanılır

  • Bir başlangıç ​​değeri oluşturmak için.

  • Özellik tanımı içinde varsayılan özellik değeri atamak için.

  • Belirli bir veri türü için bir örneği başlatmak için 'init ()' kullanılır. İnit () işlevi içinde hiçbir argüman iletilmez.

Sözdizimi

init() {
   //New Instance initialization goes here
}

Misal

struct rectangle {
   var length: Double
   var breadth: Double
   init() {
      length = 6
      breadth = 12
   }
}

var area = rectangle()
print("area of rectangle is \(area.length*area.breadth)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

area of rectangle is 72.0

Burada 'dikdörtgen' yapısı üye uzunluğu ve genişliği ile 'Çift' veri türleri olarak başlatılır. Init () yöntemi, yeni oluşturulan üyelerin uzunluğu ve çiftinin değerlerini başlatmak için kullanılır. Dikdörtgenin alanı hesaplanır ve dikdörtgen işlevi çağrılarak döndürülür.

Özellik Değerlerini Varsayılan Olarak Ayarlama

Swift 4 dili, saklanan özellik değerlerini başlatmak için Init () işlevi sağlar. Ayrıca, kullanıcı, sınıf veya yapı üyelerini bildirirken özellik değerlerini varsayılan olarak başlatma imkanına sahiptir. Özellik, program boyunca tek başına aynı değeri aldığında, onu init () içinde başlatmak yerine tek başına bildirim bölümünde bildirebiliriz. Özellik değerlerinin varsayılan olarak ayarlanması, sınıflar veya yapılar için miras tanımlandığında kullanıcıyı etkinleştirir.

struct rectangle {
   var length = 6
   var breadth = 12
}

var area = rectangle()
print("area of rectangle is \(area.length*area.breadth)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

area of rectangle is 72

Burada init () 'de uzunluk ve genişlik bildirmek yerine değerler bildirimin kendisinde başlatılır.

Parametreleri Başlatma

Swift 4 dilinde kullanıcı, init () kullanarak başlatıcının tanımının bir parçası olarak parametreleri başlatma imkanına sahiptir.

struct Rectangle {
   var length: Double
   var breadth: Double
   var area: Double
   
   init(fromLength length: Double, fromBreadth breadth: Double) {
      self.length = length
      self.breadth = breadth
      area = length * breadth
   }
   init(fromLeng leng: Double, fromBread bread: Double) {
      self.length = leng
      self.breadth = bread
      area = leng * bread
   }
}

let ar = Rectangle(fromLength: 6, fromBreadth: 12)
print("area is: \(ar.area)")

let are = Rectangle(fromLeng: 36, fromBread: 12)
print("area is: \(are.area)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

area is: 72.0
area is: 432.0

Yerel ve Dış Parametreler

Başlatma parametreleri, işlev ve yöntem parametrelerine benzer hem yerel hem de genel parametre adlarına sahiptir. Yerel parametre bildirimi, başlatma gövdesi içindeki erişim için kullanılır ve harici parametre bildirimi, başlatıcıyı çağırmak için kullanılır. Swift 4 başlatıcıları, hangi işlevleri çağırmak için hangi başlatıcının kullanıldığını tanımlamadıkları için işlev ve yöntem başlatıcıdan farklıdır.

Bunun üstesinden gelmek için Swift 4, init () içindeki her bir parametre için otomatik bir harici ad sunar. Bu otomatik harici ad, her başlatma parametresinden önce yazılan yerel adla eşdeğerdir.

struct Days {
   let sunday, monday, tuesday: Int
   init(sunday: Int, monday: Int, tuesday: Int) {
      self.sunday = sunday
      self.monday = monday
      self.tuesday = tuesday
   }
   init(daysofaweek: Int) {
      sunday = daysofaweek
      monday = daysofaweek
      tuesday = daysofaweek
   }
}

let week = Days(sunday: 1, monday: 2, tuesday: 3)
print("Days of a Week is: \(week.sunday)")
print("Days of a Week is: \(week.monday)")
print("Days of a Week is: \(week.tuesday)")

let weekdays = Days(daysofaweek: 4)
print("Days of a Week is: \(weekdays.sunday)")
print("Days of a Week is: \(weekdays.monday)")
print("Days of a Week is: \(weekdays.tuesday)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Days of a Week is: 1
Days of a Week is: 2
Days of a Week is: 3
Days of a Week is: 4
Days of a Week is: 4
Days of a Week is: 4

Harici Adsız Parametreler

Bir başlangıç ​​alt çizgisi için harici bir ad gerekmediğinde, varsayılan davranışı geçersiz kılmak için '_' kullanılır.

struct Rectangle {
   var length: Double
   
   init(frombreadth breadth: Double) {
      length = breadth * 10
   }
   init(frombre bre: Double) {
      length = bre * 30
   }
   init(_ area: Double) {
      length = area
   }
}

let rectarea = Rectangle(180.0)
print("area is: \(rectarea.length)")

let rearea = Rectangle(370.0)
print("area is: \(rearea.length)")

let recarea = Rectangle(110.0)
print("area is: \(recarea.length)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

area is: 180.0
area is: 370.0
area is: 110.0

İsteğe Bağlı Emlak Türleri

Bazı durumlarda depolanmış özellik herhangi bir değer döndürmediğinde, özellik o belirli tür için "değer yok" un döndürüldüğünü belirten "isteğe bağlı" bir türle bildirilir. Depolanan özellik "isteğe bağlı" olarak bildirildiğinde, başlatma sırasında değeri otomatik olarak "nil" olarak başlatır.

struct Rectangle {
   var length: Double?
   
   init(frombreadth breadth: Double) {
      length = breadth * 10
   }
   init(frombre bre: Double) {
      length = bre * 30
   }
   init(_ area: Double) {
      length = area
   }
}

let rectarea = Rectangle(180.0)
print("area is: \(rectarea.length)")

let rearea = Rectangle(370.0)
print("area is: \(rearea.length)")

let recarea = Rectangle(110.0)
print("area is: \(recarea.length)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

area is: Optional(180.0)
area is: Optional(370.0)
area is: Optional(110.0)

Başlatma Sırasında Sabit Özellikleri Değiştirme

Başlatma ayrıca kullanıcının sabit özelliğin değerini değiştirmesine de izin verir. Başlatma sırasında sınıf özelliği, sınıf örneklerinin alt sınıf tarafından değil süper sınıf tarafından değiştirilmesine izin verir. Örneğin, önceki programda 'uzunluk' ana sınıfta 'değişken' olarak bildirilmiştir. Aşağıdaki program değişkeni 'uzunluk', 'sabit' değişken olarak değiştirilmiştir.

struct Rectangle {
   let length: Double?
   
   init(frombreadth breadth: Double) {
      length = breadth * 10
   }
   init(frombre bre: Double) {
      length = bre * 30
   }
   init(_ area: Double) {
      length = area
   }
}

let rectarea = Rectangle(180.0)
print("area is: \(rectarea.length)")

let rearea = Rectangle(370.0)
print("area is: \(rearea.length)")

let recarea = Rectangle(110.0)
print("area is: \(recarea.length)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

area is: Optional(180.0)
area is: Optional(370.0)
area is: Optional(110.0)

Varsayılan Başlatıcılar

Varsayılan başlatıcılar, temel sınıfın veya yapının tüm bildirilen özelliklerine varsayılan değerlerle yeni bir örnek sağlar.

class defaultexample {
   var studname: String?
   var stmark = 98
   var pass = true
}
var result = defaultexample()

print("result is: \(result.studname)")
print("result is: \(result.stmark)")
print("result is: \(result.pass)")

Oyun alanını kullanarak yukarıdaki programı çalıştırdığımızda aşağıdaki sonucu alıyoruz. -

result is: nil
result is: 98
result is: true

Yukarıdaki program, sınıf adıyla 'varsayılan örnek' olarak tanımlanmıştır. Üç üye işlev varsayılan olarak 'studname?' Olarak başlatılır. 'nil' değerlerini saklamak için, 'stmark' 98 olarak ve 'pass' Boolean değeri 'true' olarak. Aynı şekilde, sınıftaki üye değerleri, sınıf üyesi türleri işlenmeden önce varsayılan olarak başlatılabilir.

Yapı Türleri için Memberwise Başlatıcıları

Özel başlatıcılar kullanıcı tarafından sağlanmadığında, Swift 4'teki Yapı türleri otomatik olarak 'üye başlatıcıyı' alacaktır. Ana işlevi, yeni yapı örneklerini varsayılan üye olarak ilklendirmeyle başlatmak ve ardından yeni örnek özellikleri adla üye olarak başlatmaya geçirilmesidir.

struct Rectangle {
   var length = 100.0, breadth = 200.0
}
let area = Rectangle(length: 24.0, breadth: 32.0)

print("Area of rectangle is: \(area.length)")
print("Area of rectangle is: \(area.breadth)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Area of rectangle is: 24.0
Area of rectangle is: 32.0

Yapılar, "uzunluk" için "uzunluk" için "100.0" ve "genişlik" için "200.0" olarak başlatma sırasında üyelik işlevleri için varsayılan olarak başlatılır. Ancak uzunluk ve genişlik değişkenlerinin 24.0 ve 32.0 olarak işlenmesi sırasında değerler geçersiz kılınır.

Değer Türleri için Başlatıcı Temsilciliği

Başlatıcı Temsilcisi, diğer başlatıcılardan başlatıcıları çağırmak olarak tanımlanır. Ana işlevi, birden çok başlatıcıda kod yinelemesini önlemek için yeniden kullanılabilirlik olarak hareket etmektir.

struct Stmark {
   var mark1 = 0.0, mark2 = 0.0
}
struct stdb {
   var m1 = 0.0, m2 = 0.0
}

struct block {
   var average = stdb()
   var result = Stmark()
   init() {}
   init(average: stdb, result: Stmark) {
      self.average = average
      self.result = result
   }

   init(avg: stdb, result: Stmark) {
      let tot = avg.m1 - (result.mark1 / 2)
      let tot1 = avg.m2 - (result.mark2 / 2)
      self.init(average: stdb(m1: tot, m2: tot1), result: result)
   }
}

let set1 = block()
print("student result is: \(set1.average.m1, set1.average.m2)
\(set1.result.mark1, set1.result.mark2)")

let set2 = block(average: stdb(m1: 2.0, m2: 2.0),
result: Stmark(mark1: 5.0, mark2: 5.0))
print("student result is: \(set2.average.m1, set2.average.m2)
\(set2.result.mark1, set2.result.mark2)")

let set3 = block(avg: stdb(m1: 4.0, m2: 4.0),
result: Stmark(mark1: 3.0, mark2: 3.0))
print("student result is: \(set3.average.m1, set3.average.m2)
\(set3.result.mark1, set3.result.mark2)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

(0.0,0.0) (0.0,0.0)
(2.0,2.0) 5.0,5.0)
(2.5,2.5) (3.0,3.0)

Başlatıcı Yetkilendirme Kuralları

Değer Türleri Sınıf Türleri
Yapılar ve numaralandırmalar gibi değer türleri için kalıtım desteklenmez. Diğer başlatıcılara başvurmak self.init aracılığıyla yapılır Kalıtım desteklenir. Depolanan tüm özellik değerlerinin başlatıldığını kontrol eder

Sınıf Mirası ve Başlatma

Sınıf türleri, tanımlanmış depolanan özelliklerin bir başlangıç ​​değeri, yani belirlenmiş başlatıcılar ve uygunluk başlatıcıları alıp almadığını kontrol etmek için iki tür başlatıcıya sahiptir.

Belirlenmiş Başlatıcılar ve Kullanışlı Başlatıcılar

Özel Başlatıcı Kullanışlı Başlatıcı
Bir sınıf için birincil olarak kabul edilir Bir sınıf için destekleyici olarak kabul edilir
Tüm sınıf özellikleri başlatılır ve uygun üst sınıf başlatıcı, daha fazla başlatma için çağrılır Atanan başlatıcı, belirli bir kullanım durumu veya giriş değeri türü için sınıf örneği oluşturmak üzere kolaylık başlatıcı ile çağrılır
Her sınıf için en az bir atanmış başlatıcı tanımlanır Sınıf başlatıcılara ihtiyaç duymadığında, kolaylık başlatıcılarının tanımlanmasına gerek yoktur.
Init (parametreler) {ifadeler} kolaylık init (parametreler) {ifadeler}

Atanan Başlatıcılar için Program

class mainClass {
   var no1 : Int // local storage
   init(no1 : Int) {
      self.no1 = no1 // initialization
   }
}

class subClass : mainClass {
   var no2 : Int // new subclass storage
   init(no1 : Int, no2 : Int) {
      self.no2 = no2 // initialization
      super.init(no1:no1) // redirect to superclass
   }
}

let res = mainClass(no1: 10)
let print = subClass(no1: 10, no2: 20)

print("res is: \(res.no1)")
print("res is: \(print.no1)")
print("res is: \(print.no2)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

res is: 10
res is: 10
res is: 20

Kullanışlı Başlatıcılar için Program

class mainClass {
   var no1 : Int // local storage
   init(no1 : Int) {
      self.no1 = no1 // initialization
   }
}

class subClass : mainClass {
   var no2 : Int
   init(no1 : Int, no2 : Int) {
      self.no2 = no2
      super.init(no1:no1)
   }
   // Requires only one parameter for convenient method
   override convenience init(no1: Int) {
      self.init(no1:no1, no2:0)
   }
}

let res = mainClass(no1: 20)
let print = subClass(no1: 30, no2: 50)

print("res is: \(res.no1)")
print("res is: \(print.no1)")
print("res is: \(print.no2)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

res is: 20
res is: 30
res is: 50

Başlatıcı Devralma ve Geçersiz Kılma

Swift 4, alt sınıflarının varsayılan olarak üye türleri için süper sınıf başlatıcılarını devralmasına izin vermez. Kalıtım, Süper sınıf başlatıcılara yalnızca Otomatik Başlatıcı Devralma bölümünde tartışılacak olan bir dereceye kadar uygulanabilir.

Kullanıcının süper sınıfta tanımlanmış başlatıcılara sahip olması gerektiğinde, başlatıcıları olan alt sınıfın kullanıcı tarafından özel uygulama olarak tanımlanması gerekir. Alt sınıf tarafından geçersiz kılma yapılması gerektiğinde, süper sınıfa 'override' anahtar sözcüğü bildirilmelidir.

class sides {
   var corners = 4
   var description: String {
      return "\(corners) sides"
   }
}

let rectangle = sides()
print("Rectangle: \(rectangle.description)")

class pentagon: sides {
   override init() {
      super.init()
      corners = 5
   }
}

let bicycle = pentagon()
print("Pentagon: \(bicycle.description)")

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Rectangle: 4 sides
Pentagon: 5 sides

Atanmış ve Kullanışlı Başlatıcılar İş Başında

class Planet {
   var name: String
   init(name: String) {
      self.name = name
   }
   convenience init() {
      self.init(name: "[No Planets]")
   }
}

let plName = Planet(name: "Mercury")
print("Planet name is: \(plName.name)")

let noplName = Planet()
print("No Planets like that: \(noplName.name)")

class planets: Planet {
   var count: Int
   init(name: String, count: Int) {
      self.count = count
      super.init(name: name)
   }
   override convenience init(name: String) {
      self.init(name: name, count: 1)
   }
}

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Planet name is: Mercury
No Planets like that: [No Planets]

Kullanılabilir Başlatıcı

Bir sınıf, yapı veya numaralandırma değerleri tanımlanırken herhangi bir başlatıcı hatası olduğunda kullanıcı bilgilendirilmelidir. Değişkenlerin ilklendirilmesi bazen şu nedenlerden dolayı başarısız olur:

  • Geçersiz parametre değerleri.
  • Gerekli harici kaynağın olmaması.
  • Başlatmanın başarılı olmasını engelleyen koşul.

Swift 4, başlatma yöntemiyle atılan istisnaları yakalamak için, yapıyı, sınıfı veya numaralandırma üyelerini başlatırken bir şeyin fark edilmeden bırakıldığını kullanıcıya bildirmek için "kullanılabilir başlatıcı" adlı esnek bir başlatma üretir. Kullanılabilen başlatıcıyı yakalamak için anahtar kelime 'init?'. Ayrıca, kullanılabilen ve kullanılamayan başlatıcılar aynı parametre türleri ve adlarıyla tanımlanamaz.

struct studrecord {
   let stname: String
   init?(stname: String) {
      if stname.isEmpty {return nil }
      self.stname = stname
   }
}
let stmark = studrecord(stname: "Swing")

if let name = stmark {
   print("Student name is specified")
}
let blankname = studrecord(stname: "")

if blankname == nil {
   print("Student name is left blank")
}

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Student name is specified
Student name is left blank

Numaralandırmalar için Kullanılabilir Başlatıcılar

Swift 4 dili, numaralandırma üyeleri değerleri başlatmaktan çıktığında kullanıcıyı bilgilendirmek için numaralandırmalar için Kullanılabilir başlatıcılara sahip olma esnekliği sağlar.

enum functions {
   case a, b, c, d
   init?(funct: String) {
      switch funct {
      case "one":
         self = .a
      case "two":
         self = .b
      case "three":
         self = .c
      case "four":
         self = .d
      default:
         return nil
      }
   }
}
let result = functions(funct: "two")

if result != nil {
   print("With In Block Two")
}
let badresult = functions(funct: "five")

if badresult == nil {
   print("Block Does Not Exist")
}

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

With In Block Two
Block Does Not Exist

Sınıflar için Kullanılabilir Başlatıcılar

Numaralandırmalar ve yapılar ile bildirildiğinde, kullanılabilir bir başlatıcı, uygulaması içindeki herhangi bir durumda bir başlatma hatasını uyarır. Ancak, sınıflarda kullanılabilir başlatıcı, yalnızca depolanan özellikler bir başlangıç ​​değerine ayarlandıktan sonra arızayı uyarır.

class studrecord {
   let studname: String!
   init?(studname: String) {
      self.studname = studname
      if studname.isEmpty { return nil }
   }
}

if let stname = studrecord(studname: "Failable Initializers") {
   print("Module is \(stname.studname)")
}

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Module is Optional("Failable Initializers")

Kullanılabilir Bir Başlatıcıyı Geçersiz Kılma

Başlatma gibi, kullanıcı da alt sınıf içindeki bir süper sınıf kullanılabilir başlatıcıyı geçersiz kılma imkanına sahiptir. Süper sınıf kullanılabilen başlatma, bir alt sınıfta kullanılamayan başlatıcı ile de geçersiz kılınabilir.

Alt sınıf başlatıcı, kullanılabilir olmayan bir alt sınıf başlatıcısı ile kullanılabilir bir üst sınıf başlatıcısını geçersiz kılarken, üst sınıf başlatıcısına kadar delege edemez.

Bulunamayan bir başlatıcı hiçbir zaman başarısız bir başlatıcıya delege edemez.

Aşağıda verilen program, mevcut ve bulunmayan başlatıcıları açıklamaktadır.

class Planet {
   var name: String
   
   init(name: String) {
      self.name = name
   }
   convenience init() {
      self.init(name: "[No Planets]")
   }
}
let plName = Planet(name: "Mercury")
print("Planet name is: \(plName.name)")

let noplName = Planet()
print("No Planets like that: \(noplName.name)")
   
class planets: Planet {
   var count: Int
   
   init(name: String, count: Int) {
      self.count = count
      super.init(name: name)
   }
   override convenience init(name: String) {
      self.init(name: name, count: 1)
   }
}

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Planet name is: Mercury
No Planets like that: [No Planets]

Başlangıç! Kullanılabilir Başlatıcı

Swift 4 'init?' Sağlar isteğe bağlı bir örnek kullanılabilir başlatıcı tanımlamak için. Belirli bir 'init!' Türünün örtük olarak sarılmamış isteğe bağlı bir örneğini tanımlamak için belirtilir.

struct studrecord {
let stname: String

   init!(stname: String) {
      if stname.isEmpty {return nil }
      self.stname = stname
   }
}
let stmark = studrecord(stname: "Swing")

if let name = stmark {
   print("Student name is specified")
}

let blankname = studrecord(stname: "")

if blankname == nil {
   print("Student name is left blank")
}

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

Student name is specified
Student name is left blank

Gerekli Başlatıcılar

Başlatma 'gerekli' anahtar sözcüğünün her bir alt sınıfını bildirmek için init () işlevinden önce tanımlanması gerekir.

class classA {
   required init() {
      var a = 10
      print(a)
   }
}

class classB: classA {
   required init() {
      var b = 30
      print(b)
   }
}

let res = classA()
let print = classB()

Yukarıdaki programı oyun alanını kullanarak çalıştırdığımızda, aşağıdaki sonucu elde ederiz -

10
30
10