我已经多次尝试过了解const关键字,但它对我来说并不合适.
我想声明一个无法更改的对象,也就是说,一个常量对象.例如,在.h文件中:
extern MyClass *use_this_object;
Run Code Online (Sandbox Code Playgroud)
并在.m文件中:
MyClass *use_this_object;
+ (void) Initialize {
use_this_object = [MyClass new];
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以在哪里放置一个const,以便其他类可以访问use_this_object但不能修改它(假设MyClass是不可变的),而MyClass类可以初始化变量?
这甚至可能吗?或者我应该使用静态方法来检索常量而不是将其声明为extern?
我正在将库转换为使用依赖注入。我遇到过这个(简化的)需要重构的代码示例:
public class MessageQueueManager {
public static readonly MessageQueueManager Instance =
new MessageQueueManager();
private readonly MessageQueue _highPriority;
private readonly MessageQueue _lowPriority;
private MessageQueueManager() {
_highPriority = new MessageQueue(1);
_lowPriority = new MessageQueue(2);
}
}
public class MessageQueue {
private int _priority;
public MessageQueue(int priority) => _priority = priority;
public void QueueMessage(Message msg) {
_queue.Add(msg);
MessageQueueManager.Instance.NotifyMessageQueued(this);
}
}
public class Message {
public Message(string text, Action onDismiss) { ... }
private void Dismiss() {
_onDismiss();
MessageQueueManager.Instance.MessageDismissed(this);
}
}
//to display a …Run Code Online (Sandbox Code Playgroud) 我正在开发一个待办事项列表应用程序.我正在寻找任何方式在任务到期时提醒用户,即使应用程序未运行.有没有办法将程序设置为在指定的时间内运行用户交互?还是一种提出警报的方法?
编辑:如何将项目添加到日历?
我有一个圆圈,里面有两个点,构成一个线段.如何计算从一个端点到线与其相交的圆的边缘的距离?
我UITableView在每个单元格中都有自定义背景图像.底部单元格具有更高的图像,其余部分,因为它包含阴影.这意味着我必须将一个部分中最后一个单元格的高度扩展到比正常高.
当我这样做时,它们的内容UITableViewCell就像它们停留在细胞底部而不是中间(因为视觉细胞比实际细胞短).有没有办法让我可以从顶部而不是中心定位我的内容,而UITableViewCell当单元格成为底部单元格时(由于删除或其他),不能调整大小?
将标签上的自动调整遮罩设置为具有静态顶部边界不起作用,也不关闭autoresizesSubviews单元格.
我还想过简单地将所有单元格设置为相同高度并关闭clipsToBounds背景图像,除了背景图像是水平和垂直的可伸缩图像,并且需要能够根据单元格内容的高度调整大小.
任何其他不涉及hackish方法的想法?
我正在尝试创建一个NSDictionary,它使用基于ID的键存储对象.我知道我可以使用NSNumber对象,但为什么我不能只使用int呢?是否有一些课程支持这个?像NSSet这样的东西几乎可以工作,除了我不能通过它的哈希值访问它(我已经重写- (NSUInteger) hash了返回对象的ID,它始终是唯一的)
我基本上试图改变这个:
//objects is an NSMutableDictionary
- (id) objectForId:(NSUInteger)id {
return [objects objectForKey:[NSNumber numberWithInt:id]];
}
- (void) addObject:(Object *)foo {
[objects setObject:foo forKey:[NSNumber numberWithInt:id]];
}
Run Code Online (Sandbox Code Playgroud)
进入这个:
//objects is an NSSet
- (id) objectForId:(NSUInteger)id {
return [objects objectForHash:id];
}
- (void) addObject:(Object *)foo {
[objects addObject:foo];
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试根据用户ID生成均匀的随机数分布。也就是说,我希望为每个用户提供一个随机数,该随机数在用户请求随机数时保持不变(但用户无需存储该数)。对于给定的大量userID,我当前的算法(在PHP中)用于统计分布$arr:
$range = 100;
$results = array_fill(0, $range, 0);
foreach ($arr as $userID) {
$hash = sha1($userID,TRUE);
$data = unpack('L*', $hash);
$seed = 0;
foreach ($data as $integer) {
$seed ^= $integer;
}
srand($seed);
++$results[rand(0, $range-1)];
}
Run Code Online (Sandbox Code Playgroud)
希望这会产生近似均匀的分布。但事实并非如此!我检查过以确保其中的每个值$arr都是唯一的,但是列表中的一个条目总是比其他所有条目具有更多的活动。是否有更好的方法来生成字符串的散列,以给出近似均匀的分布?显然,SHA无法胜任这项工作。我还尝试了MD5和简单的crc32,所有这些都具有相同的结果!
我疯了吗?实际上,我尚未验证的唯一解释是每个条目$arr都是唯一的吗?
我有一个HTTP连接,打开
HttpConnection c = (HttpConnection)Connector.open(url);
Run Code Online (Sandbox Code Playgroud)
其中url一个是:
http://foo.bar;deviceside=falsehttp://foo.bar;deviceside=false;ConnectionType=mds-publichttp://foo.bar;deviceside=true;ConnectionUID=xxxxxxxhttp://foo.bar;deviceside=true;interface=wifi如果由于设备未连接到网络而无法建立连接,是否有任何方法可以立即导致请求出错?正因为如此,它需要大约一分钟,在许多情况下超时(特别是在第一次调用获得来自网络的信息:c.getResponseCode())
编辑:我的意思是错误.在一个案例中,Wifi,具体来说,如果在超时之前没有打开wifi,它将会坐几分钟,我希望它能立即停止.
检查下面的代码
public abstract class ClassA<ClassBType extends ClassB<ClassCType>,ClassCType extends ClassC> {
public void method(ClassBType type) {
type.myClassA = this; //Error. Type mismatch: cannot convert from TestGameMain.ClassA<ClassBType,ClassCType> to TestGameMain.ClassA<TestGameMain.ClassB<ClassCType>,ClassCType>
}
}
public abstract class ClassB<ClassCType extends ClassC> {
ClassA<ClassB<ClassCType>,ClassCType> myClassA;
private void testMethod() {
myClassA.method(this);
}
}
public abstract class ClassC {}
}
Run Code Online (Sandbox Code Playgroud)
解决这个问题的正确方法是什么?
编辑:我已经更新了上面的代码,但是没有编译.
我想出了一种快速方法,可以使用注释快速测试代码中的两个变体之间进行交换:
doSomeNormalCode();
findAnObject()
//*/
.doA()
/*/
.doB()
//*/
;
additionalNormalCode();
Run Code Online (Sandbox Code Playgroud)
这称为findAnObject().doA(); 简单地删除和/之间的第一次交换.这可以通过添加更多行来扩展:.doA().doB()/*/
doSomeNormalCode();
findAnObject()
//*/
.doA()
/*/
.doB()
/*/
.doC()
/*/
.doD()
/*/
.doE()
//*/
;
additionalNormalCode();
Run Code Online (Sandbox Code Playgroud)
执行此操作findAnObject().doA().doC().doE(); 您可以将任何/*/一个//*/转换为a 来切换它下面的所有行.因此,添加/之前.doB()会将其更改为findAnObject().doA().doB().doD().doF();
这当然非常复杂.我已经习惯了它,它对我来说非常快.我从来没有将它保存在已提交的代码中,只是为了快速交换测试选项.
有没有更简单的方法在各种选项之间快速切换,除了注释掉一个部分并取消注释另一个部分,如果在注释掉的代码中有/**/注释,则需要每行都有前缀,这可能很麻烦//.
我在这里明显提到C风格的评论,但我也对其他语言感兴趣.
iphone ×2
objective-c ×2
algorithm ×1
blackberry ×1
c ×1
c# ×1
cocoa-touch ×1
comments ×1
const ×1
distance ×1
generics ×1
geometry ×1
http ×1
java ×1
java-me ×1
php ×1
random ×1
sha ×1
uitableview ×1