先提出幾個概念:
動態類型語言: 是指在運行期間才去做數據類型檢查的語言
靜態類型語言: 是指在運行前就做數據類型檢查的語言
強類型:當一個變量被指定為某數據類型時 不經過強制轉換的情況下不能改變其數據類型
弱類型:即使指定了數據類型但是不需要強轉就能改變其數據類型
個人理解如下:
動態類型就是運行期間才告訴你你的變量數據類型是什么 即使你定義了變量是string 可能運行的時候它的類型是UIView (不論是否通過強轉改變類型)
靜態類型就是運行前就告訴你變量的數據類型是什么 而且需要明確指明該變量的數據類型
強類型就是一旦變量被第一次指定了數據類型 賦值時候的類型必須與指定的類型一致 如不一致就需要強轉且強轉成功才能賦值 (通俗點就是你不是我的類型我就不接納你)
弱類型就是就算變量被指定了數據類型 但是賦值的時候會根據賦值的類型改變自己的數據類型 不需要進行強轉 (通俗點就是無論你是什么類型我都接納你而且我會根據你的類型改變自己的類型)
測試部分:
===================================================================================================================
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
編譯時通過 運行時通過 報出兩個warning
模擬器輸出如圖:
console輸出如下:
2017-08-25 11:04:28.900073-0400 ProjectOC[17839:1407977] UIView
可見:
view雖然被定義為NSString類型但是最后輸出的類型是UIView 并未經過強轉 所以OC是弱類型語言
view3處報錯 因為view3并沒有在定義時確定數據類型(view3 = NSNull) 或者數據類型未知(var view3 = NSNull)
在編譯時已經報錯并且編譯不通過 可知OC是靜態類型語言
===================================================================================================================
===================================================================================================================
swift代碼:
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//var view = "string"; ? ? ? ? ? ? ? ?//如果開啟 需關閉'let view = view2;'并打開'view = view2;' 且下面代碼會報錯
let view2 = UIView(frame:CGRect(x: 0, y: 0, width: 300, height: 300));
view2.backgroundColor = .blue;
//view = view2;? ? ? ? ? ? //如果var view = 'string' 開啟的話 報錯:Cannot assign value of type 'UIView' to type 'String'
let view = view2;
print(type(of: view)); ? ? ? ??
self.view.addSubview(view);? ? //如果var view = 'string' 開啟的話 報錯:Cannot convert value of type 'String' to expected argument type 'UIView'
}
}
模擬器輸出:
console輸出:
UIView
可見:
Swift并沒有在編譯時就需要確定變量的數據類型 故Swift為動態類型語言
如果一開始定義了view的數據類型 不強轉下賦入其他類型的變量(UIView本身不能轉換成String, 這是為了明確這個錯誤才這樣轉換,嘗試把view2定義成int也會報類似錯, 所以要轉換的類型無關 是強類型決定的) 則報錯 故Swift是強類型
===================================================================================================================
結論:
這是為了測試一種編程語言屬于哪種類型而做的測試 結論是Swift是強類型,動態類型, OC是靜態類型, 弱類型
同理推測:
PHP 弱類型 動態類型
C 強類型 靜態類型
其他以后補充...
利申: 這篇報告是出自編程自學新手 高手們路過請友善地用力指點 同時分享給其他自學新手 希望對大家有幫助