Latest web development tutorials

스위프트 건설 과정

제작 과정은 제조 과정을 수행하는 클래스, 구조 또는 열거 타입의 인스턴스를 사용하는 것이다. 이 과정은 필요한 초기화 작업의 준비 및 구현에 대한 각각의 특성과, 예를 들어 초기 값을 설정하는 것을 포함한다.

스위프트 생성자 초기화 () 메소드.

그리고 오브젝티브 C는 다른 생성자에서 생성자는 스위프트가 값을 반환 할 필요가 없습니다, 그들의 주요 임무는 새로운 인스턴스가 처음 사용하기 적절한 초기화하기 전에 완료되었는지 확인하는 것입니다.

클래스 인스턴스가 출시되기 전에 클래스의 인스턴스는 소멸자 (deinitializer) 메모리 정리 작업을 정의 할 수있다.


저장 형 속성의 초기 할당

인스턴스가 생성 될 때 클래스 및 구조는, 모든 스토리지 유형 속성에 적합한 초기 값을 설정해야한다.

생성자에서 속성 지정을 저장할 때, 그 값을 직접 설정하고 속성 관찰자를 트리거하지 않습니다.

생성자의 스토리지 속성이 할당 과정 :

  • 초기 값을 생성.

  • 속성 정의에서 기본 속성 값을 지정합니다.

  • 인스턴스를 초기화하고, 초기화 () 메소드를 호출한다.


생성자

특정 유형의 새 인스턴스를 만들 때 생성자가 호출됩니다. 가장 간단한 형태는 매개 변수 키워드 초기화 이름없는 인스턴스 메서드와 유사하다.

문법

init()
{
    // 实例化后执行的代码
}

다음 구조는 INIT를 인수없이 생성자를 정의하고, (6) 및 (12)의 초기 설정 값의 저장 유형 속성 종횡 내부 :

struct rectangle {
    var length: Double
    var breadth: Double
    init() {
        length = 6
        breadth = 12
    }
}
var area = rectangle()
print("矩形面积为 \(area.length*area.breadth)")

위의 프로그램 실행 출력은 다음과 같습니다

矩形面积为 72.0

기본 속성 값

우리는 생성자의 저장 형 속성의 초기 값을 설정할 수 있습니다 또한, 디폴트 값 속성 선언을 설정할 수 있습니다.

그것은 당신이 기본 생성자 청소기, 명확를 사용할 수 있으며, 자동으로 기본 값 유형 속성으로 추정 할 수 있습니다.

다음의 예는 우리가 기본 값을 설정하려는 경우 속성 선언 :

struct rectangle {
	// 设置默认值
    var length = 6
    var breadth = 12
}
var area = rectangle()
print("矩形的面积为 \(area.length*area.breadth)")

위의 프로그램 실행 출력은 다음과 같습니다

矩形面积为 72

구성 매개 변수

다음과 같이, 초기화 () 생성자의 매개 변수를 제공하는 생성자를 정의 할 수 있습니다 :

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("面积为: \(ar.area)")

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

위의 프로그램 실행 출력은 다음과 같습니다

面积为: 72.0
面积为: 432.0

내부 및 외부 매개 변수 이름

함수와 동일한 매개 변수와 방법, 구조 매개 변수는 내부와 생성자를 호출 할 때 사용되는 외부 매개 변수 이름의 생성자에 매개 변수의 이름이 있습니다.

그러나, 구성 기능 및 방법 등을 괄호에 인식 할 수있는 이름이 이전으로하지 않습니다. 그래서 생성자를 호출, 생성자는 생성자 매개 변수 이름과 유형을 호출 할 필요에 의해 주로 결정된다.

당신이 생성자 외부 이름을 정의 인수를 제공하지 않으면, 스위프트는 자동으로 각 생성자 매개 변수에 대해 동일한 외부 내부 이름으로 이름을 생성합니다.

struct Color {
    let red, green, blue: Double
    init(red: Double, green: Double, blue: Double) {
        self.red   = red
        self.green = green
        self.blue  = blue
    }
    init(white: Double) {
        red   = white
        green = white
        blue  = white
    }
}

// 创建一个新的Color实例,通过三种颜色的外部参数名来传值,并调用构造器
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)

print("red 值为: \(magenta.red)")
print("green 值为: \(magenta.green)")
print("blue 值为: \(magenta.blue)")

// 创建一个新的Color实例,通过三种颜色的外部参数名来传值,并调用构造器
let halfGray = Color(white: 0.5)
print("red 值为: \(halfGray.red)")
print("green 值为: \(halfGray.green)")
print("blue 值为: \(halfGray.blue)")

위의 프로그램 실행 출력은 다음과 같습니다

red 值为: 1.0
green 值为: 0.0
blue 值为: 1.0
red 值为: 0.5
green 值为: 0.5
blue 值为: 0.5

외부 매개 변수 이름 없음

당신이 생성자 매개 변수에 대한 외부 이름을 제공하지 않으려면 밑줄을 사용할 수 있습니다 _ 외부 표시 이름을 설명 할 수 있습니다.

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("面积为: \(rectarea.length)")

// 调用不提供外部名字
let rearea = Rectangle(370.0)
print("面积为: \(rearea.length)")

// 调用不提供外部名字
let recarea = Rectangle(110.0)
print("面积为: \(recarea.length)")

위의 프로그램 실행 출력은 다음과 같습니다

面积为: 180.0
面积为: 370.0
面积为: 110.0

선택 속성 유형

사용자 정의 유형이 빈 저장 형 속성을 허용하는 논리 인수를 포함하는 경우, 당신은 선택 유형 선택 type (옵션 속성 유형)으로 정의 할 필요가있다.

저장 속성 선언은 선택하면 자동 빈 전무로 초기화한다.

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("面积为:\(rectarea.length)")

let rearea = Rectangle(370.0)
print("面积为:\(rearea.length)")

let recarea = Rectangle(110.0)
print("面积为:\(recarea.length)")

위의 프로그램 실행 출력은 다음과 같습니다

面积为:Optional(180.0)
面积为:Optional(370.0)
面积为:Optional(110.0)

상수 부동산 건설 과정을 수정

구성 프로세스의 마지막에 일정한 값을 확인할 수 직전에는 건조 공정의 어느 지점에서 일정한 속성의 값을 변경할 수있다.

클래스 인스턴스의 경우, 그 일정한 속성은 해당 클래스 구성 프로세스 변형으로 정의 될 수 있으며, 서브 클래스 내에서 변경 될 수 없다.

길이 속성은 이제 상수에도 불구하고, 우리는 여전히 클래스의 생성자에서 값을 설정할 수 있습니다 :

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("面积为:\(rectarea.length)")

let rearea = Rectangle(370.0)
print("面积为:\(rearea.length)")

let recarea = Rectangle(110.0)
print("面积为:\(recarea.length)")

위의 프로그램 실행 출력은 다음과 같습니다

面积为:Optional(180.0)
面积为:Optional(370.0)
面积为:Optional(110.0)

기본 생성자

단순히 속성 값을 모두 생성합니다 기본 생성자가 기본 인스턴스로 설정되어 있습니다

다음 예, 모든 속성 ShoppingListItem 클래스는 디폴트 값을 가지고 있으며,이 기본 클래스의 아버지가 아니라, 자동으로 기본 생성자의 모든 속성에 대한 기본 값을 설정할 수 있습니다 얻을 것이다

class ShoppingListItem {
    var name: String?
    var quantity = 1
    var purchased = false
}
var item = ShoppingListItem()


print("名字为: \(item.name)")
print("数理为: \(item.quantity)")
print("是否付款: \(item.purchased)")

위의 프로그램 실행 출력은 다음과 같습니다

名字为: nil
数理为: 1
是否付款: false

생성자 구조의 각 멤버

모든 스토리지의 호텔 중 구조가 기본 값을 제공하고 자신의 사용자 정의 빌더를 제공하지 않는 경우, 자동으로 생성자의 각 구성원을 찾으실 수 있습니다.

우리가 전통적 가치를 수행하여, 생성자의 각 구성원에 전화 할 때 같은 이름의 속성 매개 변수 이름의 구성원은 구성원 속성의 초기 할당을 완료합니다.

다음 예제에서는 두 개의 속성 길이와 폭을 포함하는 구조 사각형을 정의합니다. 스위프트는이 두 가지 속성의 초기 100.0에 따라 할당 할 수 있습니다, 200.0은 자동으로 유형을 두 번 유도.

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

print("矩形的面积: \(area.length)")
print("矩形的面积: \(area.breadth)")

높이 :) : 두 개의 저장 특성은 각 생성자 초기화 (폭, 구조 사각형 자동으로 회원이 디폴트 값을 가지고 있기 때문에. 당신은 직사각형의 새로운 인스턴스를 생성하는 데 사용할 수 있습니다.

위의 프로그램 실행 출력은 다음과 같습니다

名字为: nil
矩形的面积: 24.0
矩形的面积: 32.0

값 타입 생성자 에이전트

다른 생성자를 호출하는 생성자 건설 프로세스 인스턴스의 일부를 완료합니다. 이 프로세스는 여러 생성자 사이 코드 중복을 줄일 수 있고, 구조 화제라고한다.

다음 예, 사각형 구조라고 제작 과정 및 포인트 크기의 :

struct Size {
    var width = 0.0, height = 0.0
}
struct Point {
    var x = 0.0, y = 0.0
}

struct Rect {
    var origin = Point()
    var size = Size()
    init() {}
    init(origin: Point, size: Size) {
        self.origin = origin
        self.size = size
    }
    init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2)
        let originY = center.y - (size.height / 2)
        self.init(origin: Point(x: originX, y: originY), size: size)
    }
}


// origin和size属性都使用定义时的默认值Point(x: 0.0, y: 0.0)和Size(width: 0.0, height: 0.0):
let basicRect = Rect()
print("Size 结构体初始值: \(basicRect.size.width, basicRect.size.height) ")
print("Rect 结构体初始值: \(basicRect.origin.x, basicRect.origin.y) ")

// 将origin和size的参数值赋给对应的存储型属性
let originRect = Rect(origin: Point(x: 2.0, y: 2.0),
    size: Size(width: 5.0, height: 5.0))

print("Size 结构体初始值: \(originRect.size.width, originRect.size.height) ")
print("Rect 结构体初始值: \(originRect.origin.x, originRect.origin.y) ")


//先通过center和size的值计算出origin的坐标。
//然后再调用(或代理给)init(origin:size:)构造器来将新的origin和size值赋值到对应的属性中
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
    size: Size(width: 3.0, height: 3.0))

print("Size 结构体初始值: \(centerRect.size.width, centerRect.size.height) ")
print("Rect 结构体初始值: \(centerRect.origin.x, centerRect.origin.y) ")

위의 프로그램 실행 출력은 다음과 같습니다

Size 结构体初始值: (0.0, 0.0) 
Rect 结构体初始值: (0.0, 0.0) 
Size 结构体初始值: (5.0, 5.0) 
Rect 结构体初始值: (2.0, 2.0) 
Size 结构体初始值: (3.0, 3.0) 
Rect 结构体初始值: (2.5, 2.5) 

생성자 프록시 규칙

값 유형 클래스 유형
프로세스는 비교적 간단한 구조로 제 그래서 그들은 단지 생성자 자체를 제공 할 수있는 다른 에이전트로는, 상속을 지원하지 않는다. 사용자 지정 생성자에서 값의 동일한 유형에 속하는 self.init 참조 다른 생성자를 사용할 수 있습니다. 이 클래스는 저장 형 구조가 제대로 초기화 할 수있는 경우의 상속 된 속성을 모두 보장하는 책임을 갖는다는 것을 의미한다 다른 클래스에서 상속 할 수 있습니다.

클래스의 상속 및 건설 과정

스위프트는 클래스 - 저장 특성의 모든 인스턴스는 생성자와 간이 생성자를 지정된 초기 값에 얻을 수 있도록 클래스 생성자의 두 가지 유형을 제공합니다.

생성자를 지정합니다 간이 생성자
메인 클래스의 생성자 클래스 상대적으로 작은, 지원 생성자
모든 등록 정보는 초기화 클래스까지 제공하고 부모 클래스의 초기화를 달성하기 위해 부모 체인을 기반으로 상위 클래스의 생성자를 호출한다. 당신은 생성자에 지정된 동일한 클래스를 호출하는 간이 생성자를 정의하고 매개 변수에 대한 디폴트 값을 제공 할 수 있습니다. 또한 특정 목적이나 특정 입력의 인스턴스를 생성하는 간이 생성자를 정의 할 수 있습니다.
각 클래스는 적어도 지정된 생성자가 있어야합니다 필요한 경우에만 클래스 생성자를 촉진하기 위하여
Init(parameters) {
    statements
}
convenience init(parameters) {
      statements
}

인스턴스 생성자를 지정합니다

class mainClass {
    var no1 : Int // 局部存储变量
    init(no1 : Int) {
        self.no1 = no1 // 初始化
    }
}
class subClass : mainClass {
    var no2 : Int // 新的子类存储变量
    init(no1 : Int, no2 : Int) {
        self.no2 = no2 // 初始化
        super.init(no1:no1) // 初始化超类
    }
}

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

print("res 为: \(res.no1)")
print("res2 为: \(res2.no1)")
print("res2 为: \(res2.no2)")

위의 프로그램 실행 출력은 다음과 같습니다

res 为: 10
res 为: 10
res 为: 20

간이 생성자의 예

class mainClass {
    var no1 : Int // 局部存储变量
    init(no1 : Int) {
        self.no1 = no1 // 初始化
    }
}

class subClass : mainClass {
    var no2 : Int
    init(no1 : Int, no2 : Int) {
        self.no2 = no2
        super.init(no1:no1)
    }
    // 便利方法只需要一个参数
    override convenience init(no1: Int)  {
        self.init(no1:no1, no2:0)
    }
}
let res = mainClass(no1: 20)
let res2 = subClass(no1: 30, no2: 50)

print("res 为: \(res.no1)")
print("res2 为: \(res2.no1)")
print("res2 为: \(res2.no2)")

위의 프로그램 실행 출력은 다음과 같습니다

res 为: 20
res2 为: 30
res2 为: 50

상속과 생성자 오버로드

스위프트 서브 클래스는 부모 클래스의 기본 생성자를 상속하지 않습니다.

부모 클래스의 생성자은 경우 결정 및 보안에 상속됩니다.

당신이 부모 클래스 지정된 생성자를 오버라이드 (override) 할 때 재정의 수정을 작성해야합니다.

class SuperClass {
    var corners = 4
    var description: String {
        return "\(corners) 边"
    }
}
let rectangle = SuperClass()
print("矩形: \(rectangle.description)")

class SubClass: SuperClass {
    override init() {  //重载构造器
        super.init()
        corners = 5
    }
}

let subClass = SubClass()
print("五角型: \(subClass.description)")

위의 프로그램 실행 출력은 다음과 같습니다

矩形: 4 边
五角型: 5 边

생성자 및 편의를 생성자의 예를 지정합니다

다음은 생성자, 생성자에 지정된 동작을 보여 자동 생성자 상속을 촉진 할 것이다.

그것은 MainClass, 서브 클래스 클래스 계층 구조 정의 된 두 개의 클래스를 포함하는 방법과 자신의 생성자 상호 작용을 보여줍니다.

class MainClass {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    convenience init() {
        self.init(name: "[匿名]")
    }
}
let main = MainClass(name: "w3big")
print("MainClass 名字为: \(main.name)")

let main2 = MainClass()
print("没有对应名字: \(main2.name)")

class SubClass: MainClass {
    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)
    }
}

let sub = SubClass(name: "w3big")
print("MainClass 名字为: \(sub.name)")

let sub2 = SubClass(name: "w3big", count: 3)
print("count 变量: \(sub2.count)")

위의 프로그램 실행 출력은 다음과 같습니다

MainClass 名字为: w3big
没有对应名字: [匿名]
MainClass 名字为: w3big
count 变量: 3

클래스 생성자가 실패 할 수 있습니다

클래스 오브젝트, 구조 또는 열거 형, 그것을 처리는 실패 자체를 구성 할 수 있다면, 오류는 생성자를 정의한다.

변수 초기화에 실패 가능한 원인은 다음과 같습니다 :

  • 수신 잘못된 매개 변수 값.

  • 필요한 일부 외부 리소스가 없습니다.

  • 그것은 특정 조건을 충족하지 않았다.

적절하지 수도 구성 프로세스의 경우를 처리하기 위해.

사용자는 구조의 클래스, 또는 열거 형 정의의 하나 이상의 실패 생성자를 추가 할 수있다. 구문은 초기화 키워드 Jiatian 후 물음표 (초기화?).

다음 예에서, 종 명명했다 동물 불리는 구조의 정의 문자열 유형 상수 때문이다.

한편, 구조는 생성자를 실패 할 수 있습니다 문자열 유형 매개 변수 종으로 정의합니다. 실패 할 수 있습니다 생성자는 빈 문자열, 빈 문자열에 전달 된 인수 생성자는 객체를 구축, 실패, 그렇지 않으면 성공을 실패 할 수 있는지 여부를 확인하는 데 사용됩니다.

struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}

//通过该可失败构造器来构建一个Animal的对象,并检查其构建过程是否成功
// someCreature 的类型是 Animal? 而不是 Animal
let someCreature = Animal(species: "长颈鹿")

// 打印 "动物初始化为长颈鹿"
if let giraffe = someCreature {
    print("动物初始化为\(giraffe.species)")
}

위의 프로그램 실행 출력은 다음과 같습니다

动物初始化为长颈鹿

열거 형 생성자는 실패 할 수 있습니다

당신은 생성자를 구성 할 수있는 하나 이상의 매개 변수 수는 열거 형 특정 열거 멤버를 가져 오지 못했습니다.

다음의 예에서는, 열거 타입의 정의는 TemperatureUnit 이름. 세 가지 열거 형 멤버 (켈빈, 섭씨 및 화씨)를 포함하고 실패 열거 멤버를 해당 생성자 문자 값을 찾는 데 사용 될 수있다 :

enum TemperatureUnit {
	// 开尔文,摄氏,华氏
    case Kelvin, Celsius, Fahrenheit
    init?(symbol: Character) {
        switch symbol {
        case "K":
            self = .Kelvin
        case "C":
            self = .Celsius
        case "F":
            self = .Fahrenheit
        default:
            return nil
        }
    }
}


let fahrenheitUnit = TemperatureUnit(symbol: "F")
if fahrenheitUnit != nil {
    print("这是一个已定义的温度单位,所以初始化成功。")
}

let unknownUnit = TemperatureUnit(symbol: "X")
if unknownUnit == nil {
    print("这不是一个已定义的温度单位,所以初始化失败。")
}

위의 프로그램 실행 출력은 다음과 같습니다

这是一个已定义的温度单位,所以初始化成功。
这不是一个已定义的温度单位,所以初始化失败。

클래스 생성자가 실패 할 수 있습니다

(예 : 구조 또는 열거 형 등) 값 유형은 생성자를 실패 할 수 있습니다, 언제, 어디서 건설이 동작의 제한없이 실패 트리거 할 수 있습니다.

그러나, 클래스 생성자가 실패 할 수 있고, 에이전트는 모든 클래스 중 생성자는 점화 실패 동작 후 초기화 된 모든 클래스 속성에서 발생 호출 할 수 있습니다.

, studname 속성이 아닌 전무 값이 있어야합니다 StudRecord 클래스 생성자의 성공에 한 번, 그래서 예를함으로써, StudRecord라는 클래스의 정의는 studname 속성은 상수이기 때문이다.

class StudRecord {
    let studname: String!
    init?(studname: String) {
        self.studname = studname
        if studname.isEmpty { return nil }
    }
}
if let stname = StudRecord(studname: "失败构造器") {
    print("模块为 \(stname.studname)")
}

위의 프로그램 실행 출력은 다음과 같습니다

模块为 失败构造器

생성자를 다루는 것은 실패 할 수 있습니다

다른 생성자와 마찬가지로 같은, 당신은 또한 기본 클래스 생성자가 실패 할 수 있습니다 서브 클래스의 생성자에 실패 할 수 있습니다 오버라이드 (override) 할 수 있습니다.

또한 비 생성자 서브 클래스의 실패와 함께 실패 할 수있는 기본 클래스 생성자로 대체 할 수 있습니다.

당신이 실패 할 수 있습니다 생성자를 포함하는 비 실패 생성자를 사용할 수 있지만, 차례 차례로, 그것은 작동하지 않습니다.

에이전트를 호출 할 수 없다 비 실패 생성자는 생성자를 실패 할 수 있습니다.

다음은 장애와 비 장애 생성자를 설명합니다 :

class Planet {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    convenience init() {
        self.init(name: "[No Planets]")
    }
}
let plName = Planet(name: "Mercury")
print("行星的名字是: \(plName.name)")

let noplName = Planet()
print("没有这个名字的行星: \(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)
    }
}

위의 프로그램 실행 출력은 다음과 같습니다

行星的名字是: Mercury
没有这个名字的行星: [No Planets]

생성자 초기화를 실패 할 수 있습니다!

일반적으로, 우리는 키워드 초기화 방법 후 물음표를 추가 (초기화?) 생성자를 정의하지 않을 수 있습니다,하지만 당신은 또한 실패한 생성자를 정의하는 방법 후 느낌표를 추가하여 초기화를 사용할 수 있습니다 (초기화를!) . 다음 예는 다음과 같다 :

struct StudRecord {
    let stname: String
    
    init!(stname: String) {
        if stname.isEmpty {return nil }
        self.stname = stname
    }
}

let stmark = StudRecord(stname: "w3big")
if let name = stmark {
    print("指定了学生名")
}

let blankname = StudRecord(stname: "")
if blankname == nil {
    print("学生名为空")
}

위의 프로그램 실행 출력은 다음과 같습니다

指定了学生名
学生名为空