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