一個(gè)下午讓你掌握Swift基礎(chǔ) ( 2/9 ) 變量 & 常量

簡(jiǎn)介

這是一個(gè)Swift語(yǔ)言教程,基于最新的iOS 9,Xcode 7.3和Swift 2.2,會(huì)為你介紹Swift編程非?;A(chǔ)的內(nèi)容。從電腦如何工作的全程基本原理到語(yǔ)言結(jié)構(gòu),你會(huì)足夠了解這門語(yǔ)言,來處理數(shù)據(jù)和管理代碼的行為。

快速鏈接


打開Xcode,為你自己創(chuàng)建一個(gè)最原始的playground,命名為Tutorial2使用iOS平臺(tái)。把它保存在硬盤的某個(gè)位置,然后準(zhǔn)備好開始今天的教程吧!

變量 & 常量

現(xiàn)在你知道了電腦是如何理解你寫的代碼的,也知道了該用什么工具來寫它,所以是時(shí)候開始學(xué)習(xí)Swift本身了。

這篇文章里,你會(huì)發(fā)現(xiàn)常量(constant)、變量(variable)、類型(type)和元組(tuples),學(xué)習(xí)怎么聲明他們、命名他們和改變他們。也會(huì)學(xué)習(xí)關(guān)于類型推斷(type inference),Swift最重要的特色之一,是一個(gè)會(huì)讓你的編程生涯變得簡(jiǎn)單許多的特色。

命名數(shù)據(jù)

最簡(jiǎn)單的電腦編程就只是有關(guān)操作數(shù)據(jù)的。記住,你在屏幕上看到的所有東西最后都會(huì)變成數(shù)字,你發(fā)送給CPU的數(shù)字。有些時(shí)候你自己會(huì)和不同類型的數(shù)字?jǐn)?shù)據(jù)打交道,但其他時(shí)候數(shù)據(jù)會(huì)表現(xiàn)成一種更復(fù)雜的形式,例如文本(text)、圖像和集合(collections)。

在你的Swift代碼里,你可以給數(shù)據(jù)的每一小塊一個(gè)名字,稍后用來指向它。這個(gè)名字帶有一個(gè)相關(guān)類型,類型表示這個(gè)名字指向的是哪種數(shù)據(jù):文本、數(shù)字、日期還是什么其他的。

你在這篇文章會(huì)學(xué)到一些基本類型,還有許多其他類型會(huì)在剩余的教程里穿插。

常量

看看,這是教程里出現(xiàn)的第一次Swift:

let number: Int = 10

這聲明了一個(gè)常量,叫做number,是Int類型的。然后把這個(gè)常量的值設(shè)置為數(shù)字10。

Int類型可以保存整數(shù)——就是數(shù)字啦。它被限制只能存儲(chǔ)整數(shù),所以另有一種形式來保存小數(shù)。例如:

let pi: Double = 3.14159

這和Int常量很相似,除了名字和類型不同。這次常量是Double類型的,可以存儲(chǔ)高保真的小數(shù),也就是能夠存儲(chǔ)的小數(shù)位數(shù)很多。

也有一個(gè)類型叫Float,floating point(浮點(diǎn))的縮寫,也是保存小數(shù),但比Double要低保真。一個(gè)Float數(shù)字占用的內(nèi)存比Double要少,但講道理,數(shù)字用的內(nèi)存根本不是一個(gè)大問題,你會(huì)看到大部分地方用的都是Double。

聲明好一個(gè)常量后,就不能改變它的數(shù)據(jù)了。例如下面的代碼:

let number: Int = 10 number = 0

這個(gè)代碼會(huì)產(chǎn)生一個(gè)error(錯(cuò)誤):

Cannot asign to value: 'number' is a 'let' constant(無法分配值,'number'是一個(gè)'let'常量)

在Xcode里,你會(huì)看到error這樣顯示:

常量對(duì)于不會(huì)改變的值來說很有用處。如果你在做一個(gè)模型飛機(jī),需要保持追蹤所有可用座位的個(gè)數(shù),你就要用常量。

常量也可以用作一個(gè)人的年齡。盡管年齡會(huì)隨著生日到來而改變,但你應(yīng)該只會(huì)關(guān)心他在這個(gè)特定時(shí)刻的年齡。

變量

有時(shí)候你想改變名字后面代表的數(shù)據(jù)。例如,如果你想追蹤銀行賬戶的存款和取款,你更應(yīng)該用變量而不是一個(gè)常量。

如果你的程序數(shù)據(jù)從不改變,那肯定是一個(gè)無聊的程序!但你已經(jīng)看到了,改變常量后面的數(shù)據(jù)是不可能的。

當(dāng)你知道你需要改變一些數(shù)據(jù)的時(shí)候,就應(yīng)該用變量來表示那個(gè)數(shù)據(jù),而不是常量。用相似的方式來聲明變量,像這樣:

var variableNumber: Int = 42

只有狀態(tài)的第一部分有所不同:用let聲明常量,而用var聲明變量。

聲明好變量之后,想怎么改變它都可以,只要類型仍然是相同的就可以。例如,要改變生面聲明的變量,可以這樣做:

var variableNumber: Int = 42 variableNumber = 0 variableNumber = 1_000_000

要改變變量,簡(jiǎn)單地設(shè)置它和一個(gè)新值相等。

注意:Swift里,可以選擇性地使用下劃線來讓大數(shù)字看起來更可讀。下劃線的數(shù)量和位置由你來定。

是時(shí)候介紹playground的結(jié)果邊欄了。當(dāng)你把上面的代碼輸入到playground里后,你會(huì)看到右側(cè)的結(jié)果邊欄在每一行顯示variableNumber的當(dāng)前值:

結(jié)果邊欄會(huì)在每一行顯示一個(gè)相關(guān)結(jié)果,如果存在的話。在變量或常量的例子里,結(jié)果會(huì)是新的值,不論你是剛剛聲明了一個(gè)常量,還是聲明或重新賦值了一個(gè)變量。

命名

總是要嘗試為變量和常量選擇有意義的名字。

好的名字能特別描述出變量或常量代表什么。這是一些好名字的例子:

  • personAge
  • numberOfPeople
  • gradePointAverage

壞名字通常是因?yàn)槊枋鲂圆粔?。這是一些壞名字的例子:

  • a
  • temp
  • average

秘訣就是確保你后面再讀它的時(shí)候還能理解變量或常量指的是什么。不要錯(cuò)以為你有絕對(duì)可靠的記憶!在電腦編程里早的話在一兩天后回看代碼就忘記了它是做什么的是很平常的。通過給變量和常量簡(jiǎn)便的、清晰的名字會(huì)讓自己更好過一點(diǎn)。

在Swift里,你甚至能用全部Unicode字符。這意味著你能像這樣聲明變量:

var ????: Int = -1

這看起來可能很好笑,但用這樣的特殊字符的時(shí)候還是要慎重。他們輸入起來很困難,因此可能會(huì)導(dǎo)致更多的痛苦而不是快樂。

像這樣的特殊字符在存儲(chǔ)的數(shù)據(jù)里可能比在Swift代碼里會(huì)更有意義;你在第4篇教程里會(huì)學(xué)習(xí)到更多關(guān)于Unicode的內(nèi)容,“字符串?!?/p>

類型轉(zhuǎn)換

有時(shí)候你的數(shù)據(jù)是一種格式,但需要轉(zhuǎn)換到另一種格式。天真的辦法就是這樣做:

var integer: Int = 100 var decimal: Double = 12.5 integer = decimal

如果你真的這么做了Swift會(huì)抱怨然后在第三行拋出一個(gè)錯(cuò)誤:

Cannot assign a value of type 'Double' to a value of type 'Int'(不能把一個(gè)‘Double’值分配給'Int'類型)

有一些編程語(yǔ)言不像這么嚴(yán)格,會(huì)自動(dòng)實(shí)施簡(jiǎn)單的數(shù)字轉(zhuǎn)換,就像你剛剛做的這樣。然而,Swift是一門對(duì)類型要求非常嚴(yán)格的語(yǔ)言,不允許你分配一個(gè)類型的值給另一個(gè)類型的變量。

記住,電腦依賴咱們程序員來告訴他們?cè)摳陕铩wift里,那就包括詳細(xì)表述類型轉(zhuǎn)換。如果你想讓轉(zhuǎn)換發(fā)生,就需要說出來!

不是簡(jiǎn)單地賦值,而是需要明確說明你想轉(zhuǎn)換類型。要像這樣做:

var integer: Int = 100 var decimal: Double = 12.5 integer = Int(decimal)

第三行的賦值毫不含糊地告訴Swift你想從初始類型,Double,轉(zhuǎn)換到新的類型,Int。

注意:這個(gè)例子里,分配小數(shù)值給整數(shù)結(jié)果會(huì)導(dǎo)致?lián)p失精度:整數(shù)變量最終值是12而不是12.5。這就是為什么顯示轉(zhuǎn)換類型是這么重要。Swift希望確保你了解你在做什么,因?yàn)閷?shí)施類型轉(zhuǎn)換是可能會(huì)導(dǎo)致丟失數(shù)據(jù)的。

迷你練習(xí)

如果你沒有在Xcode里跟著做完這些代碼,現(xiàn)在是時(shí)候創(chuàng)建一個(gè)新的playground然后嘗試幾個(gè)練習(xí)來測(cè)試一下自己了!

  1. 聲明一個(gè)叫做myAge的Int類型的常量,然后把它設(shè)置為你的年齡。
  2. 聲明一個(gè)叫做averageAge的Double類型變量。剛開始,把它設(shè)置為myAge;你會(huì)需要用顯示類型轉(zhuǎn)換來完成這個(gè)操作。然后,設(shè)置它為你的年齡和我自己的年齡23的平均值。只需要在腦中做這個(gè)計(jì)算就可以了——你會(huì)在接下來的教程里用Swift來做!

元組

有時(shí)候數(shù)據(jù)是一對(duì)一對(duì)的,或是個(gè)三胞胎。例如2D坐標(biāo)系里的一對(duì)(x,y)坐標(biāo)。相似的,一組3D坐標(biāo)系的坐標(biāo)由x值、y值和z值構(gòu)成。

Swift里,你可以用一種很簡(jiǎn)單的方式來表示像這樣相關(guān)的數(shù)據(jù),那就是使用元組。

元組是表示任何類型由不止一個(gè)值組成的數(shù)據(jù)類型。元組里你想有多少個(gè)值就可以有多少個(gè)值。舉個(gè)例子,你可以定義一對(duì)每個(gè)坐標(biāo)軸的值都是整數(shù)的2D坐標(biāo),像這樣:

let coordinates: (Int, Int) = (2, 3)

coordinates的類型是一個(gè)元組,包含兩個(gè)Int值。元組里的值的類型,在這個(gè)情況里是Int,被逗號(hào)間隔,用括號(hào)包圍。創(chuàng)建元組的代碼都是一樣的,每個(gè)值被逗號(hào)間隔,最外側(cè)被括號(hào)包圍。

相似的創(chuàng)建Double值的元組很簡(jiǎn)單,像這樣:

let coordinates: (Double, Double) = (2.1, 3.5)

你也可以混合然后匹配類型來組成元組,像這樣:

let coordinates: (Double, Int) = (2.1, 3)

這是訪問元組里數(shù)據(jù)的方式:

let coordinates: (Int, Int) = (2, 3) let x: Int = coordinates.0 let y: Int = coordinates.1

你可以用編號(hào)提及元組的每個(gè)項(xiàng)目,通過它在元組里的位置,從零開始。所以這個(gè)例子里,x會(huì)等于2,y會(huì)等于3。

注意:從零開始是電腦編程里的慣例,叫做零索引(zero indexing)。你會(huì)在第10篇教程里再次看到,“數(shù)組”。

在前一個(gè)例子里,第一個(gè)值,在0位置,是x坐標(biāo),第二個(gè)值,在1位置,是y坐標(biāo),看起來都不那么直觀。這又一次說明總是用避免誤解的方式來命名變量是多么重要。

還好,Swift可以單獨(dú)命名元組的部分,這樣就能明確知道每部分代表什么了。舉個(gè)例子:

let coordinatesNamed: (x: Int, y: Int) = (2, 3)

這里代碼標(biāo)注出了coordinatesNamed的類型,要為元組的每個(gè)部分包含一個(gè)標(biāo)簽。

然后,當(dāng)你需要訪問元組的各個(gè)部分的時(shí)候,你可以通過它的名字來訪問:

let x: Int = coordinatesNamed.x let y: Int = coordinatesNamed.y

這樣就很清楚了,理解起來也很簡(jiǎn)單。往往命名元組組成部分比不命名要更有幫助。

如果你一次想訪問元組的多個(gè)部分,比如在上面的例子里,你也可以使用簡(jiǎn)寫句法來更輕松地實(shí)現(xiàn):

let coordinates3D: (x: Int, y: Int, z: Int) = (2, 3, 1) let (x, y, z) = coordinates3D

這樣聲明了三個(gè)新常量,x,y和z,并且按順序分配元組里的值給他們。代碼和下面的等效:

let coordinates3D: (x: Int, y: Int, z: Int) = (2, 3, 1) let x = coordinates3D.x let y = coordinates3D.y let z = coordinates3D.z

如果你想忽略元組中一個(gè)確定的元素,你可以替換相應(yīng)的聲明部分為下劃線。例如,你如果你在做2D計(jì)算,所以希望忽略3D坐標(biāo)系里的z坐標(biāo),所以你可以這么寫:

let (x, y, _) = coordinates3D

這行代碼只聲明了x和y。_是特定的,簡(jiǎn)單的代表你現(xiàn)在要忽略這部分了。

注意:你會(huì)發(fā)現(xiàn)整個(gè)Swift中都可以用下劃線來忽略一個(gè)值。

迷你練習(xí)

  1. 聲明一個(gè)常量元組,包含三個(gè)Int值以及一個(gè)Double值。用這個(gè)來代表日期(月,日,年)以及那個(gè)日期的平均溫度。
  2. 改變?cè)M來命名組成部分。給他們和包含的數(shù)據(jù)相關(guān)的名字:month, day, year以及averageTemerature。
  3. 在一行里讀取day和平均溫度到兩個(gè)常量里。你要用下劃線來忽略month和year。
  4. 直到現(xiàn)在,你只見過常量元組。但你也可以創(chuàng)建變量元組。把在上面練習(xí)里創(chuàng)建的元組改為變量,通過使用var而不是let?,F(xiàn)在改變平均溫度到一個(gè)新的值。

類型推斷

每次你看到變量或常量被聲明,都會(huì)有一個(gè)關(guān)聯(lián)類型。直到你看見從元組中一次讀取多個(gè)值的語(yǔ)法才沒有。再看一下:

let coordinates3D: (x: Int, y: Int, z: Int) = (2, 3, 1) let (x, y, z) = coordinates3D

第二行沒有東西來指明x, y和z是Int類型的。所以Swift是怎么知道他們是Int類型的呢?

自己讀讀代碼,很明顯第二行創(chuàng)建的常量都是Int類型的。因?yàn)榇a聲明了由三個(gè)Int值組成的元組。

這說明了Swift編譯器也可以通過推理完成這個(gè)過程。不需要你告訴它類型——它自己能搞明白。機(jī)智!:]

除了元組的其他地方也可以丟掉類型,同樣能夠發(fā)生這一切。事實(shí)上,大部分情況下你都可以刪掉類型因?yàn)镾wift已經(jīng)知道了。

例如,看一下下面的常量聲明:

let typeInferredInt = 42

右手邊的值是一個(gè)整數(shù)類型。Swift也知道,所以它推斷這個(gè)常量的類型應(yīng)該是Int。這個(gè)過程被認(rèn)為是類型推斷(type inference),并且這是Swift作為一門語(yǔ)言的關(guān)鍵要素。

有時(shí)候檢查變量或常量被推斷的類型是有用的。在playground里按住Option鍵然后點(diǎn)擊變量或常量的名字就可以了。Xcode會(huì)像這樣顯示一個(gè)彈窗:

Xcode通過給你如果類型推斷的情況下你可能需要用到的聲明語(yǔ)句來告訴你推斷的類型。在這個(gè)例子了,類型就是Int。

其他類型也適用:

let typeInferredDouble = 3.14159

從這里能看出類型推斷不是什么魔法。Swift只是單純做了人類大腦做起來非常簡(jiǎn)單的事情。不使用類型推斷的編程語(yǔ)言通常會(huì)讓人感覺很啰嗦,因?yàn)槟忝看味家苊黠@的指出類型,當(dāng)你在聲明變量或常量的時(shí)候。

注意:在后面的教程里,你會(huì)學(xué)習(xí)到更復(fù)雜的類型,有時(shí)候Swift就不能推斷出類型了。盡管這是非常罕見的情況,你會(huì)看到本教程中大部分代碼范例都用了類型推斷,除了我想為你特別指明這個(gè)類型。

迷你練習(xí)

  • 創(chuàng)建一個(gè)常量元組包含兩個(gè)整數(shù)但不要寫類型。按住Option單擊檢查類型到底是不是(Int, Int)。
  • 讀取上面創(chuàng)建的元組的第一個(gè)值到另一個(gè)常量里。再次不要寫新的常量的類型。再按住Option點(diǎn)擊查看常量的類型是不是Int。

關(guān)鍵點(diǎn)

  • 常量和變量給了數(shù)據(jù)名字。
  • 當(dāng)你聲明好常量后,就不能改變它的數(shù)據(jù)了,但你能在任何時(shí)間改變變量的數(shù)據(jù)。
  • 總是給變量和常量有意義的名字來避免自己和同事將來會(huì)頭疼。
  • 可以使用元組把一組數(shù)據(jù)變成一個(gè)單獨(dú)的數(shù)據(jù)類型。
  • 類型推斷可以讓你在Swift已經(jīng)知道它的類型的情況下不用具體寫出類型。

接下來去哪兒?

現(xiàn)在你已經(jīng)知道了變量和常量,是時(shí)候關(guān)注一下它們存儲(chǔ)在那里的數(shù)據(jù)了。在接下來兩篇文章里,你會(huì)學(xué)習(xí)到最通用的一些數(shù)據(jù)類型——字符串和數(shù)字——以及你能對(duì)他們做點(diǎn)什么。

挑戰(zhàn)

在結(jié)束之前,這是給你測(cè)試變量和常量知識(shí)的一些挑戰(zhàn)。你可以在playground里嘗試打出代碼來檢查你的答案。

A挑戰(zhàn):你就是編譯器

下面哪個(gè)部分的代碼是有效的?

//1 var age = 25 age = 30

//2 let age = 25 age = 30

這是有效的代碼嗎?

let tuple: (day: Int, month: Int, year: Int) = (15, 8, 2015) let day = tuple.Day

B挑戰(zhàn):輸出結(jié)果預(yù)言家

叫value的那個(gè)常量的類型是什么?

let tuple = (100, 1.5, 10) let value = tuple.1

叫month的常量的值是什么?

let tuple: (day: Int, month: Int, year: Int) = (15, 8, 2015) let month = tuple.month


介紹

歡迎來到Swift世界!Swift是一門蘋果在2014年夏天發(fā)布的編程語(yǔ)言。從那之后,Swift發(fā)布了一個(gè)主要的版本跳躍,成為了開始在蘋果平臺(tái):iOS,OS X,watchOS和tvOS開發(fā)的最簡(jiǎn)單的方式。

誰(shuí)適合這篇教程

這篇教程適合懂一點(diǎn)編程、并且希望學(xué)習(xí)Swift的人。也許你已經(jīng)為網(wǎng)站寫過一些JavaScript代碼,或者用Python寫過一些簡(jiǎn)短的程序。這篇教程就是為你準(zhǔn)備的!你會(huì)學(xué)習(xí)到編程的基本概念,同時(shí)也會(huì)成為Swift語(yǔ)言小能手。

如果你是赤裸裸的編程新手,這篇教程也是為你準(zhǔn)備的!教程里貫穿有簡(jiǎn)短的鍛煉和挑戰(zhàn)來給你一些編程練習(xí),同時(shí)測(cè)試你的知識(shí)。

需要準(zhǔn)備什么

要看這篇教程,你需要準(zhǔn)備如下的東西:

  • 一臺(tái)運(yùn)行OS X El Captian(10.11)的Mac,帶有最新發(fā)布的更新并且安裝了安全補(bǔ)丁。這樣你才能夠安裝需要的開發(fā)工具:最新版本的Xcode。
  • Xcode 7.3或更新的版本。Xcode是用Swift寫代碼的主要開發(fā)工具。最小也需要Xcode 7.3版本,因?yàn)槟莻€(gè)版本包含Swift 2.2。你可以免費(fèi)從Mac App Store下載Xcode的最新版本,這里:http://apple.co/1FLn51R。

如果你還沒有安裝Xcode最新版本,在繼續(xù)看下面的教程前要確定安裝。

如何使用這篇教程

每篇教程都會(huì)介紹觸手可及的話題理論,伴隨大量Swift代碼來示范在學(xué)習(xí)的實(shí)際的應(yīng)用程序。

教程里的所有代碼都是平臺(tái)中立的;這意味著不是為iOS、OS X或任何其它平臺(tái)而特定。代碼在playgrounds里運(yùn)行,你在本篇中已經(jīng)學(xué)習(xí)了。

在剩下的教程里,你可以把代碼在自己的playground里輸入進(jìn)去。這樣你就可以和代碼“玩?!保╬lay around),做一些改變立即就能看見代碼運(yùn)行的結(jié)果。

剩下的教程里會(huì)貫穿實(shí)際小練習(xí),都是簡(jiǎn)短的練習(xí),關(guān)于觸手可及的主題。每篇的末尾也有挑戰(zhàn),會(huì)有編程問題也會(huì)有長(zhǎng)一點(diǎn)的代碼練習(xí)來測(cè)試你的知識(shí)。做完就能掌握大部分的Swift基礎(chǔ)知識(shí)。

教程更新

教程會(huì)隨Swift語(yǔ)言的更新而更新,會(huì)發(fā)布在我的簡(jiǎn)書和知乎專欄上,搜索“張嘉夫”即可關(guān)注我。

目錄

本教程從一些基礎(chǔ)工作開始來讓你起步:

  • 第1篇,編程本質(zhì) & Playground基礎(chǔ) - 這就是,到編程世界的入門介紹!你會(huì)從電腦和編程的預(yù)覽開始,然后剩余時(shí)間給Swift playground打個(gè)招呼。
  • 第2篇,變量 & 常量 - 你會(huì)學(xué)習(xí)到變量和常量,這是用來存儲(chǔ)數(shù)據(jù)的“地方”。你也會(huì)學(xué)習(xí)數(shù)據(jù)類型以及Swift如何追蹤數(shù)據(jù)類型并在代碼中進(jìn)行傳輸。
  • 第3篇,數(shù)字類型 & 操作 - 你會(huì)從基礎(chǔ)的數(shù)字類型比如整形和浮點(diǎn)型數(shù)字開始,當(dāng)然也包括布爾類型。也會(huì)看到一些在實(shí)際操作,從比較到算數(shù)操作如加減。
  • 第4篇,字符串 - 用字符串來存儲(chǔ)文字-從按鈕里的文字到圖片的標(biāo)注到這篇教程全部的文字,存儲(chǔ)這所有的一切!你會(huì)學(xué)習(xí)到string和character類型,以及基于這些類型的一些常見操作。

在腦海中有基礎(chǔ)數(shù)據(jù)類型后,就該用那些數(shù)據(jù)做一些事情了:

  • 第5篇,做判斷 - 代碼不總是直接從頭運(yùn)行到尾。你會(huì)學(xué)習(xí)在代碼里如何做判決并且設(shè)定情況來運(yùn)行某段代碼。
  • 第6篇,重復(fù)步驟 - 繼續(xù)不要讓代碼直線運(yùn)行的主題,你會(huì)學(xué)習(xí)到如何使用循環(huán)來重復(fù)某些步驟。
  • 第7篇,函數(shù) - 函數(shù)是Swift中用來構(gòu)建代碼的基礎(chǔ)建筑。你會(huì)學(xué)習(xí)到如何定義函數(shù)來分組代碼到可復(fù)用單元中。
  • 第8篇,閉包(Closures) - 閉包和函數(shù)很接近。你會(huì)學(xué)習(xí)到如何使用它們來輕松傳遞代碼塊。

最后一篇會(huì)回到數(shù)據(jù):

  • 第9節(jié),可選值 - 這篇講可選值,Swift中的一種特殊類型,表示既有可能是一個(gè)真實(shí)的值也有可能沒有值。這篇的最后你會(huì)知道為什么要用可選值以及如何安全地使用它們。

這些基礎(chǔ)會(huì)讓你快速開始Swift之路,做好接觸更高級(jí)編程主題的準(zhǔn)備。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容