亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift語言中的一些訪問控制設置詳解

2020-03-09 17:52:59
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Swift語言中的一些訪問控制設置詳解,是Swift入門學習中的基礎知識,需要的朋友可以參考下
 

限制訪問代碼塊,模塊和抽象通過訪問控制來完成。類,結構和枚舉可以根據自己的屬性,方法,初始化函數和下標來通過訪問控制機制進行訪問。常量,變量和函數的協議限制,并允許通過訪問控制來訪問全局和局部變量。應用于屬性,類型及函數的訪問控制可以被稱為“實體”。

訪問控制模型是基于模塊和源文件的。

模塊定義為代碼分配一個單獨的單元,并且可以使用import 關鍵字導入。源文件被定義為一個單一的源代碼文件,模塊可訪問多種類型和函數。

三種不同的訪問級別是由 Swift 語言提供。它們分別是 Public, Internal 和 Private 訪問。

Swift語言中的一些訪問控制設置詳解

語法

復制代碼代碼如下:

public class SomePublicClass {}
internal class SomeInternalClass {}
private class SomePrivateClass {}

 

public var somePublicVariable = 0
internal let someInternalConstant = 0
private func somePrivateFunction() {}


對于函數類型的訪問控制
某些函數可能有參數在函數聲明中但沒有任何返回值。下面的程序聲明 a 和 b 作為參數傳遞給sum()函數。內部函數本身為參數a和b的值是通過調用所述通過調用函數 sum(),其值被打印從而不用返回值。為了使函數的返回類型為私有,聲明函數使用 private 修飾整體訪問級別。
復制代碼代碼如下:

private func sum(a: Int, b: Int) {
   let a = a + b
   let b = a - b
   println(a, b)
}

 

sum(20, 10)
sum(40,10)
sum(24,6)


當我們使用 playground 運行上面的程序,得到以下結果

 

(30, 20)(50, 40)(30, 24)

對于枚舉類型的訪問控制

復制代碼代碼如下:

public enum Student{
   case Name(String)
   case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Swift")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
   case .Name(let studName):
      println("Student name is: /(studName).")
   case .Mark(let Mark1, let Mark2, let Mark3):
      println("Student Marks are: /(Mark1),/(Mark2),/(Mark3).")
   default:
      println("Nothing")
}

當我們使用 playground 運行上面的程序,得到以下結果

 

Student Marks are: 98,97,95

枚舉在Swift語言中將自動接收枚舉個體并都具有相同的訪問級別。例如,考慮訪問固定于三個科目枚舉名稱,學生的名字和標記被聲明為 student 而存在于枚舉類中的成員都屬于字符串數據類型名稱,標記表示為 mark1, mark2 和 mark3 數據類型為整數。要訪問無論是學生名稱或標記分數。 現在,如果被執行 Switch case 塊將打印學生姓名,否則它將打印由學生固定的標記。如果這兩個條件都失敗默認塊將被執行。

子類訪問控制
Swift 允許用戶子類,可以在當前訪問上下文存取的任何類。子類不能比其超類有更高的訪問級別。 用戶限制一個公共子類寫入一個內部超類。

復制代碼代碼如下:

public class cricket {
      private func print() {
         println("Welcome to Swift Super Class")
   }
}

 

internal class tennis: cricket  {
   override internal func print() {
      println("Welcome to Swift Sub Class")
   }
}

let cricinstance = cricket()
cricinstance.print()

let tennisinstance = tennis()
tennisinstance.print()


當我們使用 playground 運行上面的程序,得到以下結果

 

Welcome to Swift Super ClassWelcome to Swift Sub Class

常量,變量,屬性和下標訪問控制
Swift 常量,變量或屬性不能被定義比其類型更公開。這是無效一個 public 屬性與 private 類型的寫法。同樣,下標不能超過其索引或返回類型更公開。

當一個常量,變量,屬性或下標使用了一個私有類型,則常量,變量,屬性或下標,也必須標記為私有:

 

復制代碼代碼如下:
private var privateInstance = SomePrivateClass()

 

Getters 和 Setters
getter和setter常量,變量,屬性和標自動接收它們屬于相同的訪問級別的常量,變量,屬性或下標。
復制代碼代碼如下:

class Samplepgm {
   private var counter: Int = 0{
      willSet(newTotal){
         println("Total Counter is: /(newTotal)")
      }
      didSet{
         if counter > oldValue {
            println("Newly Added Counter /(counter - oldValue)")
         }
      }
   }
}

let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800


當我們使用 playground 運行上面的程序,得到以下結果

 

Total Counter is: 100Newly Added Counter 100Total Counter is: 800Newly Added Counter 700

訪問控制的初始化和默認初始化器
自定義初始化函數可分配的接入級別小于或等于它們初始化的類型。一個必需的初始化必須具有相同的訪問級別,因為它們和類相同。一個初始化的參數的類型不能比初始化自己的訪問級別更私密(更高)。

聲明每個和初始化每個子類, “required” 關鍵字需要在init()函數之前定義。

復制代碼代碼如下:

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

 

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

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


當我們使用 playground 運行上面的程序,得到以下結果

 

103010

默認初始化具有相同的訪問級別,因為它初始化,除非該類型被定義為公共類型。 當默認初始化定義為公共它被認為是內部的。當用戶需要一個公共類型在另一個模塊中的一個無參數初始化進行初始化,明確提供一個公共的無參數初始化作為類型定義的一部分。

對于協議的訪問控制
當我們定義一個新的協議,從現有的協議繼承的功能,既有聲明相同的訪問級別以相互繼承屬性。Swift 訪問控制允許用戶定義 “public” 協議,它繼承自 “internal” 的協議。

復制代碼代碼如下:

public protocol tcpprotocol {
   init(no1: Int)
}

 

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

class subClass: mainClass, tcpprotocol {
   var no2: Int
   init(no1: Int, no2 : Int) {
      self.no2 = no2
      super.init(no1:no1)
   }

   // Requires only one parameter for convenient method
   required override convenience init(no1: Int)  {
      self.init(no1:no1, no2:0)
   }
}

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

println("res is: /(res.no1)")
println("res is: /(print.no1)")
println("res is: /(print.no2)")


當我們使用 playground 運行上面的程序,得到以下結果

 

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

擴展訪問控制
當用戶使用擴展來添加協議的一致性,Swift 不允許用戶為擴展提供一個明確的訪問級別修飾符。對于在每個協議的擴展,要求實現的默認訪問級別設置自己的協議訪問級別。

對于泛型訪問控制
泛型允許用戶指定最小訪問級別來訪問類型約束其類型參數。

復制代碼代碼如下:

public struct TOS<T> {
   var items = [T]()
   private mutating func push(item: T) {
      items.append(item)
   }

 

   mutating func pop() -> T {
      return items.removeLast()
   }
}

var tos = TOS<String>()
tos.push("Swift")
println(tos.items)

tos.push("Generics")
println(tos.items)

tos.push("Type Parameters")
println(tos.items)

tos.push("Naming Type Parameters")
println(tos.items)
let deletetos = tos.pop()


當我們使用 playground 運行上面的程序,得到以下結果

 

[Swift][Swift, Generics][Swift, Generics, Type Parameters][Swift, Generics, Type Parameters, Naming Type Parameters]

對于類型別名訪問控制
用戶可以定義類型別名對待不同的訪問控制類型。 相同的訪問級別或不同的訪問級別可以由用戶定義。當類型別名為 “private” 及其相關成員可以聲明為 “private,內部 public 類型 ”。當類型別名是公共成員不能是別名為 “internal” 或 “private” 的名稱

定義任何類型別名被視為用于不同類型的訪問控制的目的。一個類型別名可以具有小于或等于它的一個訪問級別別名的類型的訪問級別。例如,private類型別名可以別名為 private, internal, 或 public,而 public 類型別名不能別名為 internal 或 private 類型。

復制代碼代碼如下:

 public protocol Container {
   typealias ItemType
   mutating func append(item: ItemType)
      var count: Int { get }
      subscript(i: Int) -> ItemType { get }
}

 

struct Stack<T>: Container {
   // original Stack<T> implementation
   var items = [T]()
   mutating func push(item: T) {
      items.append(item)
   }

   mutating func pop() -> T {
      return items.removeLast()
   }

   // conformance to the Container protocol
   mutating func append(item: T) {
      self.push(item)
   }
   
   var count: Int {
      return items.count
   }

   subscript(i: Int) -> T {
      return items[i]
   }
}

func allItemsMatch<
   C1: Container, C2: Container
   where C1.ItemType == C2.ItemType, C1.ItemType: Equatable>
   (someContainer: C1, anotherContainer: C2) -> Bool {
   // check that both containers contain the same number of items
   if someContainer.count != anotherContainer.count {
      return false
   }

   // check each pair of items to see if they are equivalent
   for i in 0..<someContainer.count {
      if someContainer[i] != anotherContainer[i] {
         return false
      }
   }

   // all items match, so return true
   return true
}

var tos = Stack<String>()
tos.push("Swift")
println(tos.items)

tos.push("Generics")
println(tos.items)

tos.push("Where Clause")
println(tos.items)

var eos = ["Swift", "Generics", "Where Clause"]
println(eos)


當我們使用 playground 運行上面的程序,得到以下結果

 

[Swift][Swift, Generics][Swift, Generics, Where Clause][Swift, Generics, Where Clause]


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美影院成年免费版| 亚洲日韩欧美视频| 日韩精品亚洲精品| 国产精品成人播放| 岛国av一区二区三区| 欧美高清在线播放| 日韩在线观看网址| 日韩欧美a级成人黄色| 91在线观看免费高清完整版在线观看| 国产精品va在线播放我和闺蜜| 中文字幕免费精品一区高清| 日韩欧美国产网站| 亚洲欧美国产视频| 日韩av电影在线免费播放| 91地址最新发布| 国产精品成人va在线观看| 一区二区在线免费视频| 亚洲欧美日韩中文在线| 免费91麻豆精品国产自产在线观看| 欧美视频国产精品| 日韩美女视频免费在线观看| 欧美性色视频在线| 欧美激情综合亚洲一二区| 不用播放器成人网| 日韩欧美在线看| 日本久久91av| 欧美久久精品午夜青青大伊人| 国产成人精品久久二区二区91| 亚洲欧美国产精品va在线观看| 亚洲最大成人在线| 亚洲人成电影网站色…| 91精品久久久久久综合乱菊| 欧美国产一区二区三区| 国产一区二中文字幕在线看| 国产精品自产拍在线观| 91精品国产99| 国产香蕉97碰碰久久人人| 欧美久久精品一级黑人c片| 国产精品香蕉国产| 国产精品成人av在线| 成人国产在线激情| 亚洲999一在线观看www| 91禁外国网站| 国产精品午夜视频| 欧美另类极品videosbest最新版本| 精品美女久久久久久免费| 欧美理论在线观看| 岛国av一区二区在线在线观看| 精品少妇v888av| 欧美成人在线免费视频| www欧美xxxx| 国产成人一区二区| 欧美在线视频网站| 日韩av大片免费看| 亚洲午夜未删减在线观看| 国产精品免费电影| 亚洲人成在线免费观看| 亚洲欧美在线看| 中文字幕亚洲一区| 精品久久香蕉国产线看观看gif| 97在线免费观看视频| 亚洲精品日韩丝袜精品| 中文字幕日韩高清| 精品中文字幕在线2019| 欧美日韩爱爱视频| 国产成人精品久久二区二区91| 福利一区视频在线观看| 日韩最新中文字幕电影免费看| 欧美综合在线观看| 久久噜噜噜精品国产亚洲综合| 国产精品影院在线观看| 国产偷亚洲偷欧美偷精品| 亚洲大胆美女视频| 国产成人高清激情视频在线观看| 成人黄色在线播放| 亚洲日本aⅴ片在线观看香蕉| 日韩av大片免费看| 97人人模人人爽人人喊中文字| 日韩大胆人体377p| 午夜精品久久久久久久久久久久久| 国产一区二区三区中文| 91免费国产网站| 精品偷拍一区二区三区在线看| 久久成人这里只有精品| 欧美精品aaa| 亚洲男人天堂2023| 国产福利视频一区二区| 中文字幕亚洲一区二区三区五十路| 亚洲精品aⅴ中文字幕乱码| 8x拔播拔播x8国产精品| 九九热这里只有精品免费看| 欧美日韩精品在线| 久久久久在线观看| 91在线精品视频| 中文字幕免费精品一区高清| 最近2019年日本中文免费字幕| 日韩精品视频三区| 中文字幕在线看视频国产欧美在线看完整| 国产欧美日韩最新| 欧美激情18p| 国产亚洲精品美女久久久| 中国china体内裑精亚洲片| 日韩经典中文字幕| 亚洲第一网站男人都懂| 日韩美女在线播放| 国产999精品久久久影片官网| 国产va免费精品高清在线观看| 7777精品视频| 久久视频在线看| 国内精品国产三级国产在线专| 亚洲精品wwwww| 欧美日韩视频在线| 久久久亚洲福利精品午夜| 久久人91精品久久久久久不卡| 中文字幕自拍vr一区二区三区| 日韩高清免费观看| 国产午夜精品视频免费不卡69堂| 97国产精品视频人人做人人爱| 亚洲欧美日韩一区二区在线| 日韩在线免费视频| 高跟丝袜欧美一区| 国产精品www色诱视频| 亚洲天堂av高清| 国产成人一区二区在线| 日韩欧美综合在线视频| 日本精品久久久| 欧美激情久久久| 久久久久久久国产精品| 成人亚洲激情网| 亚洲欧美国产日韩中文字幕| 国产一区二区三区四区福利| 日韩国产高清视频在线| 亚洲欧美激情四射在线日| 亚洲国产成人久久综合| 国产精品久久久久久久久久新婚| 午夜精品一区二区三区在线播放| 日韩中文字幕视频在线观看| 国产精品一区=区| 精品福利一区二区| 91九色单男在线观看| 亚洲精品美女免费| 国产丝袜一区视频在线观看| 浅井舞香一区二区| 91香蕉嫩草神马影院在线观看| 欧美日韩一区二区在线播放| 亚洲精品久久久久久久久久久久| 国产精品美乳一区二区免费| 久久99国产综合精品女同| 午夜精品福利在线观看| 成人久久久久久久| 日韩不卡中文字幕| 97精品欧美一区二区三区| 高清欧美性猛交| 亚洲欧美国产高清va在线播| 精品中文字幕久久久久久| 有码中文亚洲精品| 欧美电影免费在线观看| 欧美性理论片在线观看片免费| 久久手机免费视频| 欧美xxxx做受欧美.88| 在线播放国产一区中文字幕剧情欧美| 亚洲午夜未删减在线观看| 国产一区二区三区欧美| 亚洲xxxx在线|