类扩展的一个强大优势是,使用类扩展,您可以在头文件中声明readonly属性,并在类扩展中将此属性覆盖为readwrite属性.如下所示:
//SomeClass.h
@interface SomeClass : NSObject
{
NSInteger someInt; //with modern runtime you can omit this line
}
@property (readonly) NSInteger someInt;
@end
//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end
@implementation SomeClass
@synthesize someInt;
@end
Run Code Online (Sandbox Code Playgroud)
但是如果你使用现代运行时,你也可以在类扩展中声明一个全新的属性(如果没有,也为该属性生成一个iVar).
//SomeClass.h
@interface SomeClass : NSObject
{
}
@end
//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end
@implementation SomeClass
@synthesize someInt;
@end
Run Code Online (Sandbox Code Playgroud)
这是我的问题:我认为在课堂扩展中声明一个全新的属性在某种程度上会产生一些副作用.因为类扩展我不在头文件中,而另一个继承类的人可能不知道那个"秘密属性".如果他宣布一个与该"秘密财产"同名的财产.而这个新属性的getter和setter方法将覆盖超类.这不是问题吗?为什么现代运行时会允许这样的事情发生?
编辑我发布了关于这个主题的另一个问题,请查看: 在类扩展(Ojbective-C)中声明新的propery的风险,如何解决?
静态变量"声明变量static将其范围限制为仅仅类 - 并且仅限于在文件中实现的类的部分"(Apple doc).
而且我认为在类扩展中定义的变量只有在定义它的类中才有限制范围.
那是类似的!
类扩展中的静态变量和变量有什么不同?
我仍在学习 Swift,我正在尝试创建一个扩展来向 UITextView 添加占位符。
我的想法是创建 2 个 UITextViews,一个用文本作为占位符,当用户开始编辑文本时,它实际上是隐藏的,用户正在修改另一个 UITextView。
然而,我在这里的问题不是在 UITextView 中有一个占位符,而是关于如何使用扩展来解决这个问题。
我的问题是,我必须在我的实现中更改什么才能创建一个从调用方看起来像的扩展:
myTextView.placeholder("a placeholder text..")
到目前为止,我已经在我的 UIViewController 中创建了它,并且需要将它移动到一个扩展中,但是我有很多存储的属性,所以它不起作用。
这是我的代码:
import UIKit
class ViewController: UIViewController, UITextViewDelegate {
let myTextView: UITextView = {
let textView = UITextView()
textView.tag = 0
textView.backgroundColor = UIColor.yellow
textView.layer.cornerRadius = 8
textView.translatesAutoresizingMaskIntoConstraints = false
return textView
}()
let textViewPlaceHolder: UITextView = {
let textViewPlaceHolder = UITextView()
textViewPlaceHolder.tag = 1
textViewPlaceHolder.text = "Placeholder text.."
textViewPlaceHolder.textColor = UIColor.lightGray
textViewPlaceHolder.backgroundColor = UIColor.clear
textViewPlaceHolder.translatesAutoresizingMaskIntoConstraints = false
return textViewPlaceHolder
}() …Run Code Online (Sandbox Code Playgroud) 在某些语言(如C#和Objective C)中,您可以创建类扩展.这意味着您可以向现有类添加其他方法,而无需扩展该类.这在Java中可行吗?
我想向Array类添加一些函数(我宁愿不要将它们作为类外部的函数使用,因为理想情况.下,在对象后面键入时可以发现它们)。这是我到目前为止的内容:
export class List<T> extends Array<T> {
constructor(items?: Array<T>) {
super(...items)
Object.setPrototypeOf(this, List.prototype);
}
get first(): T {
return this[0]
}
}
Run Code Online (Sandbox Code Playgroud)
运行良好:
const list = new List([1,2,3]);
console.log(list.first)
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试运行此命令:
const list = new List([1,2,3]);
console.log(list.map(x=>x*2))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
super(...items)
^
TypeError: Found non-callable @@iterator
Run Code Online (Sandbox Code Playgroud)
理想情况下,我将获得一个对象,该对象等效于new List(this.map(x=>x*2))如何在无需重写Array的所有方法的情况下扩展Array类?