首先我們要知道哪些類型可以用For In吧,下面就是:
- for Element in ArrayExpr do Stmt; 數組
- for Element in StringExpr do Stmt; 字符串
- for Element in SetExpr do Stmt; 集合
- for Element in CollectionExpr do Stmt; 集合
- for Element in Record do Stmt; 結構體
我們來看例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
type
THuangJacky = (hjA,hjB,hjC,hjD);
TJackyHuang =
record
a,b,c:
Integer
;
end
;
const
stringExpr=
'HuangJacky'
;
arrayExpr:
array
[
0..5
]
of
Integer
= (
1
,
2
,
3
,
4
,
5
,
6
);
setExpr:
set
of
THuangJacky = [hjA,hjB,hjD];
procedure
TForm1
.
FormCreate(Sender: TObject);
var
I:
Integer
;
C:
Char
;
D:THuangJacky;
F:TComponent;
begin
for
c
in
stringExpr
do
ShowMessage(C);
for
i
in
arrayExpr
do
ShowMessage(IntToStr(i));
for
d
in
setExpr
do
ShowMessage(IntToStr(Ord(d)));
for
F
in
Self
do
ShowMessage(f
.
Name);
end
;
|
是不是很爽呀?哈哈,Delphi也與時俱進呀.
之前寫了類助手文章中,老趙問是不是擴展方法,因為對C#沒有了解到這么多,所以不知道.
那么我們在Java中要For In必須實現Iterator吧.
那么Delphi的會不會也要呢?
是的,如果我們要自己的類支持For In的話,就必須滿足下面的條件:
1 必須有個公共方法GetEnumerator(),這個方法返回值是一個類,接口或者記錄體.
2 上面返回的類,接口或者記錄體中又必須有公共方法MoveNext(),這個方法的返回值是Boolean.
3 1中返回的類,接口或者記錄體中必須有一個只讀的屬性Current,類型要和集合中的元素一樣.
說了這么多,看個例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
type
TMyIntArray =
array
of
Integer
;
TMyEnumerator =
class
Values: TMyIntArray;
Index:
Integer
;
public
constructor
Create;
function
GetCurrent:
Integer
;
function
MoveNext:
Boolean
;
property
Current:
Integer
read GetCurrent;
end
;
TMyContainer =
class
public
function
GetEnumerator: TMyEnumerator;
end
;
constructor
TMyEnumerator
.
Create;
begin
inherited
Create;
Values := TMyIntArray
.
Create(
100
,
200
,
300
);
Index := -
1
;
end
;
function
TMyEnumerator
.
MoveNext:
Boolean
;
begin
if
Index < High(Values)
then
begin
Inc(Index);
Result :=
True
;
end
else
Result :=
False
;
end
;
function
TMyEnumerator
.
GetCurrent:
Integer
;
begin
Result := Values[Index];
end
;
function
TMyContainer
.
GetEnumerator: TMyEnumerator;
begin
Result := TMyEnumerator
.
Create;
end
;
var
MyContainer: TMyContainer;
I:
Integer
;
Counter:
Integer
;
begin
MyContainer := TMyContainer
.
Create;
Counter :=
0
;
for
I
in
MyContainer
do
Inc(Counter, I);
WriteLn
(
'Counter = '
, Counter);
end
.
|