什么是Swift中的“获取”和“设置”?

时间:2014-07-11 13:48:43

标签: swift accessor

我正在学习Swift,我正在阅读Apple的The Swift Programming Language,我没有Objective C背景(只有PHP,JS和其他但没有Obj C)

在第24-25页,我看到了这段代码:

//...Class definition stuff...

var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
}

//...Class continues...

这部分未在书中指明,我无法得到它们的用途。

有人能解释一下获取设置是什么?

5 个答案:

答案 0 :(得分:100)

在类中获取和设置变量是指检索(“获取”)或更改(“设置”)其内容。

考虑类members的变量family。当然,这个变量需要是一个整数,因为一个家族永远不能由两个人组成。

所以你可能会继续这样定义members变量:

class family {
   var members:Int
}

然而,这将使使用该课程的人有可能将家庭成员的数量设置为0或1。并且因为没有1或0的家庭,所以这是非常不幸的。 / p>

这就是getter和setter的用武之地。通过这种方式,您可以自己决定如何更改变量以及可以接收哪些值,以及决定返回哪些内容。

回到我们的家庭班,让我们确保没有人可以将members值设置为小于2的任何值:

class family {
  var _members:Int = 2
  var members:Int {
   get {
     return _members
   }
   set (newVal) {
     if newVal >= 2 {
       _members = newVal
     } else {
       println('error: cannot have family with less than 2 members')
     }
   }
  }
}

现在我们可以像以前一样通过输入members来访问instanceOfFamily.members变量,并且感谢setter函数,我们也可以像以前一样通过键入来设置它的值,例如:{{1 }}。然而,改变的是,我们不能再将此变量设置为小于2的任何值。

请注意instanceOfFamily.members = 3变量的引入,该变量是存储我们通过_members setter函数设置的值的实际变量。原始members现在已成为计算属性,这意味着它只作为处理我们实际变量的接口。

答案 1 :(得分:31)

在代码之前实际解释过:

  

除了存储的简单属性外,属性还可以包含getter和setter。

class EquilateralTriangle: NamedShape {
    ...

当其他一些类想要获取该周长变量时,他们会这样做:

let someVar = myTriangle.perimeter

......这叫做:

get{
    return 3.0 * self.sideLength
}

因此,如果呼叫控制器执行此操作,它本质上就像:

let someVar = 3.0 * myTriangle.sideLength

当您从另一个对象设置变量时,它看起来像这样:

myTriangle.perimeter = 100

调用set{}块中的代码:

set {
    sideLength = newValue / 3.0
}

所以,如果设置变量的班级已经这样做了:

myTriangle.sideLength = 100/3.0

这只是为了方便 - 你可以从其他代码中调用它,而不必一直除以或乘以3,因为在设置之前就已经完成了在获得变量之前的变量。

在Swift中,我们可以拥有在获取时计算的属性,并且可以在设置时执行某些操作。我们也可以在Objective-C中做到这一点:

// .h
@property (nonatomic) double perimeter;

//.m

- (double)perimeter
{
    return self.sideLength * 3.0;
}
- (void)setPerimeter:(double)perimeter
{
    self.perimeter = perimeter; // In Swift, this is done automatically.
    self.sideLength = perimeter / 3.0;
}

答案 2 :(得分:15)

一个简单的问题应该是简短明了的答案。

  • 当我们获取该属性的值时,它会触发其get{}部分。

  • 当我们为属性设置值时,它会触发set{}部分。

PS。为属性设置值时,SWIFT会自动创建一个名为“newValue”的常量=我们正在设置的值。在属性的set{}部分中可以访问常量“newValue”之后。

示例:

var A:Int = 0
var B:Int = 0

var C:Int {
get {return 1}
set {print("Recived new value", newValue, " and stored into 'B' ")
     B = newValue
     }
}

//When we are getting a value of C it fires get{} part of C property
A = C 
A            //Now A = 1

//When we are setting a value to C it fires set{} part of C property
C = 2
B            //Now B = 2

答案 3 :(得分:1)

您应该查看Computed Properties

在您的代码示例中,perimeter是不由类变量备份的属性,而是使用get方法计算其值并通过set方法存储 - 通常引用作为 getter setter

当你使用这样的属性时:

var cp = myClass.perimeter

你正在调用get代码块中包含的代码,当你像这样使用它时:

myClass.perimeter = 5.0

您正在调用set代码块中包含的代码,其中newValue会自动填充赋值运算符右侧提供的值。

如果指定了getter和setter,则可以读取计算属性,如果仅指定了getter,则可以读取。

答案 4 :(得分:0)

变量在类中声明并调用

 public class ScreenSlidePageFragment extends Fragment {

 private Button button1,button2,button3,button4;
 static private int turn=0;

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v1=(ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page1, container, false);
        View v2= (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page2, container, false);


        button1=v1.findViewById(R.id.button1);
        button2=v1.findViewById(R.id.button2);
        button3=v1.findViewById(R.id.button3);

        button4=v2.findViewById(R.id.button4);
         
        
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                button2.setPressed(false);
                button2.setSelected(false);

                button3.setPressed(false);
                button3.setSelected(false);


                button4.setSelected(true);
                button4.setPressed(true);
                button1.setSelected(true);
                button1.setPressed(true);
              
            }
        });

         button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


               

                button3.setPressed(false);
                button3.setSelected(false);


                button4.setSelected(false);
                button4.setPressed(false);
                button1.setSelected(false);
                button1.setPressed(false);
                 button2.setPressed(true);
                button2.setSelected(true);
              
            }
        });


         button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                button2.setPressed(false);
                button2.setSelected(false);
                button4.setSelected(false);
                button4.setPressed(false);
                button1.setSelected(false);
                button1.setPressed(false);
                button3.setPressed(true);
                button3.setSelected(true);

              
            }
        });

         button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                button2.setPressed(false);
                button2.setSelected(false);

                button3.setPressed(false);
                button3.setSelected(false);


               
                button1.setSelected(false);
                button1.setPressed(false);
                button4.setSelected(true);
                button4.setPressed(true);
              
            }
        });
        

        if (turn == 0) {
            turn=1;
            return v1;

        }
        else
        {
            turn = 0;
            return v2;


        }


    }
}
               

现在您要编程以使x的默认值大于或等于3。现在假设假设的情况是,如果x小于3,则您的程序将失败。因此,您希望人们输入3或大于3。Swift为您提供了便利,并且了解这种对变量值进行日期排序的先进方法非常重要,因为它们将广泛用于iOS开发中。现在让我们看看如何在这里使用get和set。

class X {
    var x: Int = 3

}
var y = X()
print("value of x is: ", y.x)

//value of x is:  3

如果您仍然有疑问,请记住,get和set的使用是按照我们希望其更新的方式来更新任何变量。获取和设置将使您更好地控制规则。功能强大的工具因此不容易理解。