2015-04-17 84 views
1

得到这个是我们在OC如何处理与存储性能的设置,并在迅速

- (void)setText:(NSString *)text 
{ 
    if ([text isEqualToString:@"ss"]) { 
     _text = @"xx"; 
     return 
    } 
    _text = text; 
} 

- (NSString *)text 
{ 
    return _text; 
} 

处理财产的方式,这是在迅速错误的方式,我们不能称之为self.xx在集。

var text : NSString { 
    get { 
     return self.text 
    } 
    set { 
     if newValue.isEqualToString("ss") { 
      self.text = "xx" 
     } else { 
      self.text = newValue 
     } 
    } 
} 

我的问题是如何将OC代码转移到Swift代码。

+0

只要你不是在文本的getter中调用'text'的getter,或者在'text'的setter中调用'text'的setter,就可以在get和set中调用'self' 。这就是你现在正在做的事情,这会导致无限循环。 – ABakerSmith

回答

3

你混淆存储性能与计算性能。

只有计算的属性有一个getter和一个可选的setter;存储的属性也没有。此外,计算属性中的setter不是用来设置计算属性的值(它不能,因为属性很好,计算也没有独立存在);相反,它用于设置其他属性的值,其值用于在下次访问时计算计算属性。有关示例,请参见this post

现在,存储的属性可以有属性观察者。在您的具体的例子,它是这样的:

var text : NSString! { 
    didSet { 
     if text.isEqualToString("ss" as NSString) { 
      text = "xx" as NSString 
     } 
    } 
} 

你也可以有一个willSet块。请注意,在Swift 1.2中,NSString和String不再自动桥接,因此您需要在必要时将它们彼此对齐。

1

虽然我不太了解在存储属性上使用getter和setter,但在您的情况下,您可以只使用属性观察者didSet

var text: String! { 
    didSet { 
     if text == "ss" { 
      text = "xx" 
     } 
    } 
} 
1

您可以试试这种方式!

var text: NSString = "" 

     var newText : NSString { 
      get { 
       return text 
      } 
      set { 
       if newValue.isEqualToString("ss") { 
        text = "xx" 
       } else { 
        text = newValue 
       } 
      } 
     }