先提出幾個(gè)概念:
動(dòng)態(tài)類(lèi)型語(yǔ)言: 是指在運(yùn)行期間才去做數(shù)據(jù)類(lèi)型檢查的語(yǔ)言
靜態(tài)類(lèi)型語(yǔ)言: 是指在運(yùn)行前就做數(shù)據(jù)類(lèi)型檢查的語(yǔ)言
強(qiáng)類(lèi)型:當(dāng)一個(gè)變量被指定為某數(shù)據(jù)類(lèi)型時(shí) 不經(jīng)過(guò)強(qiáng)制轉(zhuǎn)換的情況下不能改變其數(shù)據(jù)類(lèi)型
弱類(lèi)型:即使指定了數(shù)據(jù)類(lèi)型但是不需要強(qiáng)轉(zhuǎn)就能改變其數(shù)據(jù)類(lèi)型
個(gè)人理解如下:
動(dòng)態(tài)類(lèi)型就是運(yùn)行期間才告訴你你的變量數(shù)據(jù)類(lèi)型是什么 即使你定義了變量是string 可能運(yùn)行的時(shí)候它的類(lèi)型是UIView (不論是否通過(guò)強(qiáng)轉(zhuǎn)改變類(lèi)型)
靜態(tài)類(lèi)型就是運(yùn)行前就告訴你變量的數(shù)據(jù)類(lèi)型是什么 而且需要明確指明該變量的數(shù)據(jù)類(lèi)型
強(qiáng)類(lèi)型就是一旦變量被第一次指定了數(shù)據(jù)類(lèi)型 賦值時(shí)候的類(lèi)型必須與指定的類(lèi)型一致 如不一致就需要強(qiáng)轉(zhuǎn)且強(qiáng)轉(zhuǎn)成功才能賦值 (通俗點(diǎn)就是你不是我的類(lèi)型我就不接納你)
弱類(lèi)型就是就算變量被指定了數(shù)據(jù)類(lèi)型 但是賦值的時(shí)候會(huì)根據(jù)賦值的類(lèi)型改變自己的數(shù)據(jù)類(lèi)型 不需要進(jìn)行強(qiáng)轉(zhuǎn) (通俗點(diǎn)就是無(wú)論你是什么類(lèi)型我都接納你而且我會(huì)根據(jù)你的類(lèi)型改變自己的類(lèi)型)
測(cè)試部分:
===================================================================================================================
OC代碼:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//view3 = NSNull;? ? //Unexpected interface name 'NSNull': expected expression
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //Use of undeclared identifier 'view3'
//var view3 = NSNull; ? ? ? ? //Use of undeclared identifier 'var'
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
view2.backgroundColor = [UIColor redColor];
NSString *view = view2;? ? ? ? ? ? //Incompatible pointer types initializing 'NSString *' with an expression of type 'UIView *'
NSLog(@"%@",view.class);
[self.view addSubview:view]; ? ? //Incompatible pointer types sending 'NSString *' to parameter of type 'UIView * _Nonnull'
// Do any additional setup after loading the view, typically from a nib.
}
@end
編譯時(shí)通過(guò) 運(yùn)行時(shí)通過(guò) 報(bào)出兩個(gè)warning
模擬器輸出如圖:
console輸出如下:
2017-08-25 11:04:28.900073-0400 ProjectOC[17839:1407977] UIView
可見(jiàn):
view雖然被定義為NSString類(lèi)型但是最后輸出的類(lèi)型是UIView 并未經(jīng)過(guò)強(qiáng)轉(zhuǎn) 所以O(shè)C是弱類(lèi)型語(yǔ)言
view3處報(bào)錯(cuò) 因?yàn)関iew3并沒(méi)有在定義時(shí)確定數(shù)據(jù)類(lèi)型(view3 = NSNull) 或者數(shù)據(jù)類(lèi)型未知(var view3 = NSNull)
在編譯時(shí)已經(jīng)報(bào)錯(cuò)并且編譯不通過(guò) 可知OC是靜態(tài)類(lèi)型語(yǔ)言
===================================================================================================================
===================================================================================================================
swift代碼:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//var view = "string"; ? ? ? ? ? ? ? ?//如果開(kāi)啟 需關(guān)閉'let view = view2;'并打開(kāi)'view = view2;' 且下面代碼會(huì)報(bào)錯(cuò)
let view2 = UIView(frame:CGRect(x: 0, y: 0, width: 300, height: 300));
view2.backgroundColor = .blue;
//view = view2;? ? ? ? ? ? //如果var view = 'string' 開(kāi)啟的話 報(bào)錯(cuò):Cannot assign value of type 'UIView' to type 'String'
let view = view2;
print(type(of: view)); ? ? ? ??
self.view.addSubview(view);? ? //如果var view = 'string' 開(kāi)啟的話 報(bào)錯(cuò):Cannot convert value of type 'String' to expected argument type 'UIView'
}
}
模擬器輸出:
console輸出:
UIView
可見(jiàn):
Swift并沒(méi)有在編譯時(shí)就需要確定變量的數(shù)據(jù)類(lèi)型 故Swift為動(dòng)態(tài)類(lèi)型語(yǔ)言
如果一開(kāi)始定義了view的數(shù)據(jù)類(lèi)型 不強(qiáng)轉(zhuǎn)下賦入其他類(lèi)型的變量(UIView本身不能轉(zhuǎn)換成String, 這是為了明確這個(gè)錯(cuò)誤才這樣轉(zhuǎn)換,嘗試把view2定義成int也會(huì)報(bào)類(lèi)似錯(cuò), 所以要轉(zhuǎn)換的類(lèi)型無(wú)關(guān) 是強(qiáng)類(lèi)型決定的) 則報(bào)錯(cuò) 故Swift是強(qiáng)類(lèi)型
===================================================================================================================
結(jié)論:
這是為了測(cè)試一種編程語(yǔ)言屬于哪種類(lèi)型而做的測(cè)試 結(jié)論是Swift是強(qiáng)類(lèi)型,動(dòng)態(tài)類(lèi)型, OC是靜態(tài)類(lèi)型, 弱類(lèi)型
同理推測(cè):
PHP 弱類(lèi)型 動(dòng)態(tài)類(lèi)型
C 強(qiáng)類(lèi)型 靜態(tài)類(lèi)型
其他以后補(bǔ)充...
利申: 這篇報(bào)告是出自編程自學(xué)新手 高手們路過(guò)請(qǐng)友善地用力指點(diǎn) 同時(shí)分享給其他自學(xué)新手 希望對(duì)大家有幫助