Delphi新语法 For ..In

首先我们要知道哪些类型可以用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.

 
https://blog.csdn.net/rocklee/article/details/48627165
原文地址:https://www.cnblogs.com/findumars/p/9362036.html